There is a bug in the SD library for opening root that causes the position of root to not be at the beginning.
Add a dir.seek(0) to your printDirectory function like this:
void printDirectory(File dir, int numTabs)
{
int nEntries = 0;
char buf[32];
dir.seek(0);
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
//Serial.println("**nomorefiles**");
entry.close(); // Added
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
//Serial.println("/");
//printDirectory(entry, numTabs+1); // no recursion
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
nEntries++;
}
entry.close(); // Added
}
sprintf( buf, "%d", nEntries );
Serial.println( "" );
Serial.print( buf );
Serial.println( " entries found." );
}