f_readdir

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

FRESULT f_readdir (
  DIR* dp,      /* [IN] ディレクトリ ブジェクト構造体へのポインタ */
  FILINFO* fno  /* [OUT] ファイル情報構造体へのポインタ */
);

引数

dp
f_opendir関数で作成された有効なディレクトリ オブジェクトへのポインタを指定します。
fno
読み出したディレクトリ項目を格納するファイル情報構造体へのポインタを指定します。

戻り値

FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE

解説

ディレクトリの項目(ファイルおよびサブ ディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については FILINFO構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、fno->fname[]にヌル文字列が返されます。fnoにヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。

ドット エントリ(".""..")は、相対パスが有効なとき(_FS_RPATH >= 1)にのみ出力に現れます。

LFN機能が有効な時は、この関数の呼び出しに先立ってfno->lfnamefno->lfsizeが有効な値で初期化されていなければなりません。lfnameはLFNを格納するバッファを示し、lfsizeはそのバッファの要素数を示します。LFNを読み出す必要がないときは、lfnameにヌル ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。

対応情報

_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;
}

参照

f_opendir, f_closedir, f_stat, FILINFO, DIR

戻る