Got the following code to work on a UNO; And on MEGA with a revision to do more folder depth.
Found out that the SD Card had become corrupted resulting in a listing of 17 files, now getting 474 files listed on Mega (some issues).
/*
SD card basic file example
This example shows how to create and destroy an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
#include <SD.h>
//#define MEGA 1; //uncomment on MEGA boards
File root;
static int counter;
char thisentryname[256] = {0};
const char lastentryname01[1] = {0};
char lastentryname0[8] = {""};
char lastentryname1[8] = {""};
char lastentryname2[8] = {""};
char lastentryname3[8] = {""};
char lastentryname4[8] = {""};
char lastentryname5[8] = {""};
char lastentryname6[8] = {""};
char lastentryname7[8] = {""};
char lastentryname8[8] = {""};
#ifdef MEGA
char lastentryname9[8] = {""};
char lastentryname10[8] = {""};
char lastentryname11[8] = {""};
char lastentryname12[8] = {""};
char lastentryname13[8] = {""};
char lastentryname14[8] = {""};
char lastentryname15[8] = {""};
char lastentryname16[8] = {""};
#endif
void setup()
{
// Open serial communications and wait for port to open:
#ifdef ARDUINO
if(ARDUINO <= 105){ //for IDE 1.0.5
Serial.begin(115200);
}else{ //latest stable version 1.8.19
Serial.begin(2000000);
}
#elif
Serial.begin(9600);
#endif
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println( freeMemory() );
Serial.print(F("Initializing SD card..."));
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(SS, OUTPUT);
if (!SD.begin(SS)) {
Serial.println(F("initialization failed!"));
return;
}
Serial.println(F("initialization done."));
Serial.println(F("Send X to exit, Send R for readonly, Continue full read (Y/N)? "));
}
void loop()
{
// nothing happens after setup finishes.
char inChar = Serial.read();
if (inChar == 'Y' || inChar == 'y' || inChar =='r' || inChar == 'R'){
bool noreadfile;
if (inChar =='r' || inChar == 'R'){ noreadfile = true; }else{ noreadfile = false; }
root = SD.open("/");
counter = 0;
Serial.println( freeMemory() );
//lastentryname01[0] = 0;
lastentryname0[0] = lastentryname01[0];
lastentryname1[0] = lastentryname01[0];
lastentryname2[0] = lastentryname01[0];
lastentryname3[0] = lastentryname01[0];
lastentryname4[0] = lastentryname01[0];
lastentryname5[0] = lastentryname01[0];
lastentryname6[0] = lastentryname01[0];
lastentryname7[0] = lastentryname01[0];
lastentryname8[0] = lastentryname01[0];
#ifdef MEGA
lastentryname9[0] = lastentryname01[0];
lastentryname10[0] = lastentryname01[0];
lastentryname11[0] = lastentryname01[0];
lastentryname12[0] = lastentryname01[0];
lastentryname13[0] = lastentryname01[0];
lastentryname14[0] = lastentryname01[0];
lastentryname15[0] = lastentryname01[0];
lastentryname16[0] = lastentryname01[0];
#endif
printDirectory(root, 0, noreadfile, -1);
root.close();
Serial.print(F("done "));
Serial.print( counter );
Serial.println(F("!"));
}
}
void printDirectory( File dir, const int numTabs, const bool noreadfile, int type) {
const char bs[] = {"/"};
while(true) {
File entry = dir.openNextFile();
char inCharx[0] = {}; inCharx[0] = Serial.read();
if (inCharx[0] == 'X' || inCharx[0] == 'x'){
break;
}
if (! entry) {
// no more files
//Serial.println("**nomorefiles**");
break;
}
//for (uint8_t i=0; i<numTabs; i++) {
// Serial.print('\t');
//}
//Serial.print(entry.name());
//Serial.print("------");
//Serial.print(numTabs);
if (entry.isDirectory()) {
if(numTabs==0){ strcpy(lastentryname0,entry.name()); }
if(numTabs+1==1){ strcpy(lastentryname1,entry.name());}
if(numTabs+1==2){ strcpy(lastentryname2,entry.name());}
if(numTabs+1==3){ strcpy(lastentryname3,entry.name());}
if(numTabs+1==4){ strcpy(lastentryname4,entry.name());}
if(numTabs+1==5){ strcpy(lastentryname5,entry.name());}
if(numTabs+1==6){ strcpy(lastentryname6,entry.name());}
if(numTabs+1==7){ strcpy(lastentryname7,entry.name());}
if(numTabs+1==8){ strcpy(lastentryname8,entry.name());}
#ifdef MEGA
if(numTabs+1==9){ strcpy(lastentryname9,entry.name());}
if(numTabs+1==10){ strcpy(lastentryname10,entry.name());}
if(numTabs+1==11){ strcpy(lastentryname11,entry.name());}
if(numTabs+1==12){ strcpy(lastentryname12,entry.name());}
if(numTabs+1==13){ strcpy(lastentryname13,entry.name());}
if(numTabs+1==14){ strcpy(lastentryname14,entry.name());}
if(numTabs+1==15){ strcpy(lastentryname15,entry.name());}
if(numTabs+1==16){ strcpy(lastentryname16,entry.name());}
#endif
printDirectory(entry, numTabs+1, noreadfile, 1);
} else {
if (type!=-1){ type = 0; }
// files have sizes, directories do not
//Serial.print("\t\t");
//Serial.println(entry.size(), DEC);
// char thisentryname[256] = {0};
char entryname[int(String(entry.name()).length())] = {0};
// if(numTabs==0 && type==-1){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat(thisentryname, entryname); }
// if(numTabs==0 && type==1){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==1){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==2){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==3){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==4){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==5){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==6){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==7){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==8){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
#ifdef MEGA
if(numTabs+1==9){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==10){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname,lastentryname10); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==11){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname,lastentryname10); strcat(thisentryname,bs); strcat(thisentryname,lastentryname11); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==12){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname,lastentryname10); strcat(thisentryname,bs); strcat(thisentryname,lastentryname11); strcat(thisentryname,bs); strcat(thisentryname,lastentryname12); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==13){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname,lastentryname10); strcat(thisentryname,bs); strcat(thisentryname,lastentryname11); strcat(thisentryname,bs); strcat(thisentryname,lastentryname12); strcat(thisentryname,bs); strcat(thisentryname,lastentryname13); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==14){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname,lastentryname10); strcat(thisentryname,bs); strcat(thisentryname,lastentryname11); strcat(thisentryname,bs); strcat(thisentryname,lastentryname12); strcat(thisentryname,bs); strcat(thisentryname,lastentryname13); strcat(thisentryname,bs); strcat(thisentryname,lastentryname14); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==15){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname,lastentryname10); strcat(thisentryname,bs); strcat(thisentryname,lastentryname11); strcat(thisentryname,bs); strcat(thisentryname,lastentryname12); strcat(thisentryname,bs); strcat(thisentryname,lastentryname13); strcat(thisentryname,bs); strcat(thisentryname,lastentryname14); strcat(thisentryname,bs); strcat(thisentryname,lastentryname15); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
if(numTabs+1==16){ strcpy(entryname,entry.name()); strcpy(thisentryname, bs); strcat (thisentryname, lastentryname0); strcat(thisentryname,bs); strcat (thisentryname, lastentryname1); strcat(thisentryname,bs); strcat (thisentryname, lastentryname2); strcat(thisentryname,bs); strcat (thisentryname, lastentryname3); strcat(thisentryname,bs); strcat (thisentryname, lastentryname4); strcat(thisentryname,bs); strcat (thisentryname, lastentryname5); strcat(thisentryname,bs); strcat (thisentryname, lastentryname6); strcat(thisentryname,bs); strcat (thisentryname, lastentryname7); strcat(thisentryname,bs); strcat (thisentryname, lastentryname8); strcat(thisentryname,bs); strcat(thisentryname,lastentryname9); strcat(thisentryname,bs); strcat(thisentryname,lastentryname10); strcat(thisentryname,bs); strcat(thisentryname,lastentryname11); strcat(thisentryname,bs); strcat(thisentryname,lastentryname12); strcat(thisentryname,bs); strcat(thisentryname,lastentryname13); strcat(thisentryname,bs); strcat(thisentryname,lastentryname14); strcat(thisentryname,bs); strcat(thisentryname,lastentryname15); strcat(thisentryname,bs); strcat(thisentryname,lastentryname16); strcat(thisentryname,bs); strcat(thisentryname, entryname); }
#endif
if(type==-1){ strcpy(thisentryname, bs); strcat(thisentryname, entryname); }
Serial.print( F("(") );
//Serial.write( thisentryname );
//try removing multiple / symbols
// char lastchar[8] = {0};
// bool flag = false;
String charbuild =F("");
charbuild.reserve(int(strlen(thisentryname)));
charbuild = thisentryname;
//while( charbuild.indexOf("//")!=-1 ){ charbuild.replace("//","/"); }
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
#ifdef MEGA
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
charbuild.replace(F("//"),F("/"));
#endif
/*String dlastchar = ""; dlastchar.reserve(1);
for (char *p = thisentryname; *p; p++) {
if(*p == '/'){ if(dlastchar.indexOf('/')==-1){Serial.print("hi");dlastchar = *p;}else{dlastchar = *p;}}
if(dlastchar.indexOf('/')==-1){charbuild += *p; }else{ if(*p==bs[0]){charbuild += dlastchar; p++;}else{p++;}
dlastchar=*p;
}
}
*/
strcpy(thisentryname,charbuild.c_str());
int sx = 0; while(sx<int(strlen(thisentryname))){
Serial.write(thisentryname[sx]);
sx++;
}
Serial.println( F(")") );
counter++;
if(!noreadfile){
File dataFile = SD.open(String(thisentryname).c_str(), FILE_READ );
// File dataFile = SD.open(entry.name());
// if the file is available, read from it:
if (dataFile) {
while (dataFile.available()) {
Serial.write(dataFile.read());
}
dataFile.close();
}
// if the file isn't open, pop up an error:
else {
Serial.println(F("File error opening for reading..."));
}
}//!noreadfile
// free(thisentryname);
}
if(entry/*.isDirectory()*/){entry.close();} // = freezes at this line, 13 files listed, so test to see if entry object is still present before closing
if (freeMemory() < 500){ Serial.print(F("Low memory ")); Serial.println( freeMemory() ); }
}
//Serial.println(F("ending printdirectory"));
//Serial.println( freeMemory() );
//if(dir.isDirectory()){dir.close();}
}
#ifdef __arm__
// should use uinstd.h to define sbrk but Due causes a conflict
extern "C" char* sbrk(int incr);
#else // __ARM__
extern char *__brkval;
#endif // __arm__
int freeMemory() {
char top;
#ifdef __arm__
return &top - reinterpret_cast<char*>(sbrk(0));
#elif defined(CORE_TEENSY) || (ARDUINO > 103 && ARDUINO != 151)
return &top - __brkval;
#else // __arm__
return __brkval ? &top - __brkval : &top - __malloc_heap_start;
#endif // __arm__
}