## 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構造体の`lfname`と`lfsize`が有効な値で初期化されていなければなりません。`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`

戻る