#include <SD.h> // шина SPI (pins 11,12,13) + 10(SS-pin, он же обычно CSpin) 
#define CS_PIN 10 //вывод выбора чипа. PIN10 стандартно. Его нельзя иначе использовать
File root; //переменная класса File
void loop() { }
void setup() { Serial.begin(115200);    Serial.print("Initializing SD card... ");

 if(!SD.begin(CS_PIN)) { Serial.println("Card initialization failed!"); while(true);  }
 Serial.println("initialization done.");//SD.begin() д.б.выполнен обязат,можно без аргумента CS_PIN

 Serial.println("Files in the card:");
 root = SD.open("/"); // bool root, ссылающийся на открытый на SD файл для чтения (по умолчанию)
 printDirectory(root, 0); /*func*/   Serial.println("");

/* File textFile = SD.open("wokwi.txt");  // Печать текста из wokwi.txt
    if(textFile)       {
      Serial.print("wokwi.txt: ");
      while (textFile.available() ) { //доступно ли какое-либо кол-во БАЙТОВ для чтения из файла.
       Serial.write(textFile.read());} //Собственно команда печати текста из wokwi.txt
      textFile.close(); } 
    else Serial.println("error opening wokwi.txt!");   */
            } //конец setup

void printDirectory(File dir, int numTabs) { //аргументы:файл,номер
  while(true) {
    File entry =  dir.openNextFile(); //entry - формальная переменная класса File
    if(!entry) break;    // no more files
          
    for(byte i = 0; i < numTabs; i++)  Serial.print('\t'); //ср. available()... БАЙТОВ
    
    Serial.print(entry.name());
    if(entry.isDirectory()) /*является ли текущий файл каталогом?*/ { Serial.println("/");
      printDirectory(entry, numTabs + 1); /*след.номер*/                         } 
    else {  // files have sizes, directories do not
      Serial.print("\t\t");  Serial.println(entry.size());                  }
    entry.close();
  }
}