Problèmes avec SdFat et getName()

Bonjour à tous

j’ai écran TFT 2.2" qui accepte une carte SD.

j’ai fait quelques tests avec et tout est OK.

J’ai besoin de récupérer le nom complet des fichiers contenus sur la carte SD.

J’ai écrit un programme de test pour comprendre comment fonctionne la librairie SdFat

#include <SPI.h>
#include "SdFat.h"

#define SD_CS  24 // SD card select pin

SdFat SD; // Class w/image-reading functions

SdFile root;
FatFile file;
//SdFile file;
char nom_fichier[30];
size_t tab = 20;
//FatFile* repertoire;
//int i=0;

void setup() {
  Serial.begin(115200);
  
  if(!SD.begin(SD_CS, SD_SCK_MHZ(25))) { // ESP32 requires 25 MHz limit
    Serial.println(F("SD begin() failed"));
    for(;;); // Fatal error, do not continue
  }
  //root.open("/");
  
    if (!root.open("/")) {
    SD.errorHalt("open root failed");
  }  
  Serial.println("PROGRAMME LECTURE FICHIERS SD CARD");
  
  SD.chdir("/");
  SD.vwd()->rewind();
  while(file.openNext(SD.vwd(), O_READ)){
    if (!file.isHidden()) {
      file.getName(nom_fichier, sizeof(nom_fichier));
      Serial.print("Le nom du fichier est : ");
      Serial.println(nom_fichier);
    }// fin if
  }//fin while
  Serial.println(" ");
  Serial.println("Utilise .ls pour lister tous les fichiers");
  Serial.print(SD.ls("/"));
}

void loop() {
  // put your main code here, to run repeatedly:
  
}

Sauf que la boucle while ne m’affiche rien, sachant que mes fichiers sont à la racine de la carte.

voici le résultat du programme dans le Serial monitor

PROGRAMME LECTURE FICHIERS SD CARD

Utilise .ls pour lister tous les fichiers
pca8897_ble.bmp
pca11586_vallee_fleurie.bmp
pca11607_lac_montagne.bmp
READNUM.TXT
1

Et je ne comprend où est mon erreur

Merci pour votre aide

Si tu utilises cette bibliothèque SDFat, il existe une fonction pour lister les fichiers : ls

/** List directory contents.
*

  • \param[in] flags The inclusive OR of
  • LS_DATE - %Print file modification date
  • LS_SIZE - %Print file size.
  • LS_R - Recursive list of subdirectories.
  • \return true for success or false if an error occurred.
    */
    bool ls(uint8_t flags = 0) {
    return ls(&Serial, flags);
    }

Elle est utilisée dans cet exemple (ligne 143) :

sd.ls(LS_R | LS_DATE | LS_SIZE);

Ok merci je vais regarder ça

dans mon code pour que ça marche il faut ajouter file.close(); ce qui donne

  while(file.openNext(SD.vwd(), O_READ)){
    if (!file.isHidden() && file.isFile()) {
      file.getName(nom_fichier, sizeof(nom_fichier));
      j++;
      Serial.print(j);
      Serial.print(F(" Le nom du fichier est : ")); Serial.print(nom_fichier);
      Serial.print("\tTaille : "); Serial.print (file.fileSize()); Serial.println(F(" octets"));    
    }// fin if
    file.close();  //ferme le fichier avant de passer au suivant
  }//fin while

il faut sans doute ouvrir le directory en lecture

SdFile root;
SdFile file;

...

  if (root.open("/")) {
    while (file.openNext(&root, O_RDONLY)) {
      if (! file.isHidden()) {
        ...
      }
      file.close();
    }
    root.close();
  }
  
...