f_readdir

ディレクトリ項目を読み出します

FRESULT f_readdir (
  DIR* DirObject,    /* ディレクトリ・ブジェクト構造体へのポインタ */
  FILINFO* FileInfo  /* ファイル情報構造体へのポインタ */
);

引数

DirObject
ディレクトリ・オブジェクト構造体へのポインタを指定します。
FileInfo
読み出したディレクトリ項目を格納するファイル情報構造体へのポインタを指定します。

戻り値

FR_OK (0)
正常終了。
FR_NOT_READY
メディアがセットされていないなど、ディスク・ドライブが動作不能状態。
FR_DISK_ERR
ディスク・エラーによる失敗。
FR_INT_ERR
不正なFAT構造または内部エラーによる失敗。
FR_INVALID_OBJECT
無効なディレクトリ・オブジェクト。

解説

ディレクトリ項目を順次読み出します。この関数を繰り返し実行することによりディレクトリの全ての項目を読み出すことができます。全ての項目を読み出し、読み出す項目がもう無いときは、f_name[]メンバにヌル文字列が返されます。得られるファイル情報の詳細については FILINFO構造体を参照してください。FileInfoにヌル・ポインタを指定すると、そのディレクトリのリード・インデックスを巻き戻します。

LFN機能が有効な時は、f_readdir関数の呼び出しに先立ってFILINFO構造体のlfnamelfsizeが有効な値で初期化されていなければなりません。lfnameはLFNを格納するバッファで、lfsizeはそのバッファ・サイズです。LFN格納バッファまたはLFN操作バッファどちらかのサイズがそのLFNのサイズに対して不十分だった場合、またはLFNが存在しない場合はLFN格納バッファにヌル文字列が返されます。lfnameにヌル・ポインタを指定した場合は、LFNに関して何も返されません。

_FS_MINIMIZE >= 2ではこの関数はサポートされません。

使用例

FRESULT scan_files (char* path)
{
    FRESULT res;
    FILINFO fno;
    DIR dir;
    int i;
    char *fn;
#if _USE_LFN
    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 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);
            if (res != FR_OK || fno.fname[0] == 0) break;
#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;
}

参照

f_opendir, f_stat, FILINFO, DIR

戻る