Afficher la taile d'un fichier en KB

Bonjour,
J'utilise la fonction list Dir des exemples del'ESP32 sous arduino 1.8.19 (windows 10) core 2.0.1, mais à l'affichage la taille des fichiers sont en octets.

Si je divise par 1024 la taille du fichier j'obtiens 0 pour tous les fichiers ayant une taille inférieur à 1024.

Je suppose qu'il faut un printf avec un float et 3 chiffres après la virgule.
par exemple sous dos en faisant un dir j'ai 2 400, équivalent 2KB 400, j'ai aimerais avoir cela.
Le code:

void listDir(fs::FS &fs, const char * dirname, uint8_t levels) {
  Terminal.printf("Listing directory: %s\r\n", dirname);

  File root = fs.open(dirname);
  if (!root) {
    Terminal.write("Failed to open directory\r\n");
    return;
  }
  if (!root.isDirectory()) {
    Terminal.write("Not a directory\r\n");
    return;
  }

  File file = root.openNextFile();
  while (file) {
    if (file.isDirectory()) {
      Terminal.write("  DIR : \e[93m");
      Terminal.write(file.name());
      Terminal.write("\e[92m\r\n");     
      if (levels) {
        listDir(fs, file.name(), levels - 1);
      }
    } else {
      Terminal.print("  FILE: ");
      Terminal.print(file.name());
      Terminal.print("\tSIZE: \e[97m");
      Terminal.print(file.size());                     <====== ici la taille à modifier
      Terminal.write("\e[92m\r\n");      
    }
    file = root.openNextFile();
  }
  Terminal.printf("\r\nTotal space: %lluMB\r\n", SD.totalBytes() / (1024 * 1024));
  Terminal.printf("Used space: %lluMB\r\n", SD.usedBytes() / (1024 * 1024));
  
  error = false;
  state = State::Prompt;
}

Merci de votre aide.

J'ai trouvé un code qui fonctionne.

void pretty_bytes(char* buf, uint bytes)
{
    const char* suffixes[7];
    suffixes[0] = "B";
    suffixes[1] = "KB";
    suffixes[2] = "MB";
    suffixes[3] = "GB";
    suffixes[4] = "TB";
    suffixes[5] = "PB";
    suffixes[6] = "EB";
    uint s = 0; // which suffix to use
    double count = bytes;
    while (count >= 1024 && s < 7)
    {
        s++;
        count /= 1024;
    }
    if (count - floor(count) == 0.0)
        sprintf(buf, "%d %s", (int)count, suffixes[s]);
    else
        sprintf(buf, "%.2f %s", count, suffixes[s]);
}

Problème résolu

C’est parce que vous faites une division entière

si la taille est un entier

taille / 1024 est le nombre de Ko
taille % 1024 est le nombre d’octets restants (% c’est l’opération modulo)

par exemple si taille vaut 1030
taille / 1024 = 1
taille % 1024 = 6
On a 1 Ko et 6 octets

Merci pour l'information.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.