ディレクトリ項目を読み出します。
FRESULT f_readdir ( DIR* dp, /* [IN] ディレクトリ ブジェクト構造体へのポインタ */ FILINFO* fno /* [OUT] ファイル情報構造体へのポインタ */ );
ディレクトリの項目(ファイルとディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については FILINFO構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、fno->fname[]にヌル文字列が返されます。fnoにヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。
ドット エントリ("."と"..")は、相対パスが有効なとき(_FS_RPATH >= 1)にのみ出力に現れます。
LFN機能が有効な時は、この関数の呼び出しに先立ってFILINFO構造体のlfnameとlfsizeが有効な値で初期化されていなければなりません。lfnameはLFNを格納するバッファで、lfsizeはそのバッファの要素数です。LFNを読み出す必要がないときは、lfnameにヌル ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。
また、そのディレクトリ項目にLFN情報が存在しない場合は、fname[]に英小文字が含まれる場合があります。
_FS_MINIMIZE <= 1のときに使用可能です。
FRESULT scan_files (
char* path /* 開始ノード (ワークエリアとしても使用) */
)
{
FRESULT res;
FILINFO fno;
DIR dir;
int i;
char *fn; /* 非Unicode構成を想定 */
#if _USE_LFN
static char lfn[_MAX_LFN + 1];
fno.lfname = lfn;
fno.lfsize = sizeof lfn;
#endif
res = f_opendir(&dir, path); /* ディレクトリを開く */
if (res == FR_OK) {
i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno); /* ディレクトリ項目を1個読み出す */
if (res != FR_OK || fno.fname[0] == 0) break; /* エラーまたは項目無しのときは抜ける */
if (fno.fname[0] == '.') continue; /* ドットエントリは無視 */
#if _USE_LFN
fn = *fno.lfname ? fno.lfname : fno.fname;
#else
fn = fno.fname;
#endif
if (fno.fattrib & AM_DIR) { /* ディレクトリ */
sprintf(&path[i], "/%s", fn);
res = scan_files(path);
path[i] = 0;
if (res != FR_OK) break;
} else { /* ファイル */
printf("%s/%s\n", path, fn);
}
}
f_closedir(&dir);
}
return res;
}