Arduino IDEでファイル一覧の取得が遅い
2024 年現在でも、国内ではなぜか古い方法しかヒットしないためメモします。
ESP32 の Arduino IDE では、SD カード内のファイル一覧を取得する場合、SD.h を使用する古い方法しか検索でヒットしません。次のような感じです。
以前の方法(遅い)
#include <SPI.h>
#include <SD.h>
...
if (SD.begin(CS_PIN)) {
FILE root = SD.open("/"); // ルート
while (1) {
File entry = root.openNextFile();
if (!entry) {
break;
}
if (!entry.isDirectory()) { // ディレクトリでなければ
String fileName = entry.name();
...
}
}
root.close();
}
この、旧来の方法はすべてのファイルをopenしているため非常に遅い処理となっています。
FS.hを使った方法(超高速)
FS.h で新たに定義されたgetNextFileName
を使うとファイルのオープンを行わないため高速にファイルのシークが行えます。
新しい方法
#include <SPI.h>
#include <FS.h>
#include <SD.h>
...
bool isDir;
if (SD.begin(CS_PIN)) {
File root = SD.open("/");
while (1) {
String fileName = root.getNextFileName(&isDir);
if (fileName == "") break; // ファイルがない場合
if (isDir) break; // ディレクトリの場合
...
}
root.close();
}