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

- ディレクトリ項目にLFN情報が存在しない。
- LFNの長さに対してLFN格納バッファまたはLFN操作バッファのサイズが不十分。
- LFNに現在のOEMコードに存在しない文字が含まれている。(非Unicode構成のとき)

また、そのディレクトリ項目に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;
    }

#### 参照

`f_opendir, f_closedir, f_stat, FILINFO, DIR`

戻る