ディレクトリ項目を読み出します
FRESULT f_readdir ( DIR* DirObject, /* ディレクトリ・ブジェクト構造体へのポインタ */ FILINFO* FileInfo /* ファイル情報構造体へのポインタ */ );
ディレクトリ項目を順次読み出します。この関数を繰り返し実行することによりディレクトリの全ての項目を読み出すことができます。全ての項目を読み出し、読み出す項目がもう無いときは、f_name[]メンバにヌル文字列が返されます。ボリューム・ラベルは読み出すときに棄てられ、現れることはありません。"."、".."は、相対パスが有効なとき(_FS_RPATH == 1)にのみ現れます。得られるファイル情報の詳細については FILINFO構造体を参照してください。FileInfoにヌル・ポインタを指定すると、そのディレクトリのリード・インデックスを巻き戻します。
LFN機能が有効な時は、f_readdir関数の呼び出しに先立ってFILINFO構造体のlfnameとlfsizeが有効な値で初期化されていなければなりません。lfnameはLFNを格納するバッファで、lfsizeはそのバッファ・サイズ(TCHAR)です。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。
また、lfnameにヌル・ポインタを指定した場合は、LFNに関して何も返されません。LFNが存在しないときは、f_name[]メンバのSFNにASCII英小文字が含まれる場合があります。
_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); if (res != FR_OK) break; path[i] = 0; } else { /* ファイル */ printf("%s/%s\n", path, fn); } } } return res; }