mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-19 23:22:16 +03:00
SD - examples/listfilesEnhanced (#9206)
* add new example for enhanced file listing * adapt Pin * adapt due to clanf format check in line 14 * Adapt further clang findings * additional intention corrections * last clang format issues corrected * case-sensitive, eof line break
This commit is contained in:
parent
ccea72823a
commit
9e3ba26258
134
libraries/SD/examples/listfilesEnhanced/listfilesEnhanced.ino
Normal file
134
libraries/SD/examples/listfilesEnhanced/listfilesEnhanced.ino
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
Listfiles Enhanced
|
||||
|
||||
This example demonstrates how to list files on an SDcard in the following way:
|
||||
1) collect all directories
|
||||
2) build full path of directories and keep in mind
|
||||
3) then print all files with the help of the directorie pathes
|
||||
|
||||
Wiring:
|
||||
SDcard attached to SPI bus as follows:
|
||||
- MOSI: pin 11
|
||||
- MISO: pin 12
|
||||
- CLK : pin 13
|
||||
- CS : pin 4
|
||||
|
||||
Created:
|
||||
18. Nov 2024 by Frank Häfele
|
||||
|
||||
This example code is in the public domain.
|
||||
|
||||
*/
|
||||
#include <SPI.h>
|
||||
#include <SD.h>
|
||||
#include <vector>
|
||||
|
||||
#define SD_CS_PIN 4
|
||||
|
||||
|
||||
void dir(String path) {
|
||||
std::vector<String> directories;
|
||||
collectDirectories(path, directories);
|
||||
for (auto directory : directories) {
|
||||
printDirectoryName(directory.c_str(), 1);
|
||||
File fs = SD.open(directory);
|
||||
printFilesInDirectory(fs);
|
||||
Serial.println("\n===============");
|
||||
fs.close();
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
// Open serial communications and wait for port to open:
|
||||
Serial.begin(115200);
|
||||
|
||||
Serial.print("\n\n==== List Directory ====\n\n");
|
||||
listDirectory();
|
||||
|
||||
Serial.println("done!");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// nothing happens after setup finishes.
|
||||
}
|
||||
|
||||
void listDirectory() {
|
||||
Serial.print("\n\nInitializing SD card...");
|
||||
if (!SD.begin(SD_CS_PIN)) {
|
||||
Serial.println("initialization failed!");
|
||||
return;
|
||||
}
|
||||
Serial.print("initialization successful.\n");
|
||||
Serial.print("List Files:\n");
|
||||
dir("/");
|
||||
}
|
||||
|
||||
|
||||
void printDirectoryName(const char *name, uint8_t level) {
|
||||
for (uint8_t i = 0; i < level; ++i) {
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println(name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// helper function: combine path
|
||||
String joinPath(const String &base, const String &name) {
|
||||
if (base.endsWith("/")) {
|
||||
return base + name;
|
||||
}
|
||||
return base + "/" + name;
|
||||
}
|
||||
|
||||
// recusive function to collect directory names
|
||||
void collectDirectories(const String &dirname, std::vector<String> &directories) {
|
||||
File root = SD.open(dirname);
|
||||
if (!root || !root.isDirectory()) {
|
||||
Serial.printf("Error: Cannot open %s\n", dirname.c_str());
|
||||
return;
|
||||
}
|
||||
directories.push_back(dirname);
|
||||
|
||||
File file = root.openNextFile();
|
||||
while (file) {
|
||||
if (file.isDirectory()) {
|
||||
String fullPath = joinPath(dirname, file.name());
|
||||
collectDirectories(fullPath, directories);
|
||||
}
|
||||
file = root.openNextFile();
|
||||
}
|
||||
root.close();
|
||||
}
|
||||
|
||||
// print filenames
|
||||
void printFileName(File file) {
|
||||
Serial.print("\t");
|
||||
Serial.printf("%30s", file.name());
|
||||
// files have sizes, directories do not
|
||||
Serial.print(" - ");
|
||||
Serial.print(file.size(), DEC);
|
||||
time_t cr = file.getCreationTime();
|
||||
time_t lw = file.getLastWrite();
|
||||
struct tm *tmstruct = localtime(&cr);
|
||||
Serial.printf("\tCREATION: %d-%02d-%02d %02d:%02d:%02d", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
|
||||
tmstruct = localtime(&lw);
|
||||
Serial.printf("\tLAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
|
||||
}
|
||||
|
||||
|
||||
// print files in directories
|
||||
void printFilesInDirectory(File dir) {
|
||||
while (true) {
|
||||
auto file = dir.openNextFile();
|
||||
if (!file) {
|
||||
// no more files
|
||||
break;
|
||||
}
|
||||
if (file.isDirectory()) {
|
||||
continue;
|
||||
} else {
|
||||
printFileName(file);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user