FatFs - f_readdir

## 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[]`メンバにヌル文字列が返されます。ボリューム名は読み出すときに棄てられ、現れることはありません。"."、".."は、相対パスが有効なとき(`_FS_RPATH == 1`)にのみ現れます。得られるファイル情報の詳細については `FILINFO`構造体を参照してください。FileInfoにヌル・ポインタを指定すると、そのディレクトリのリード・インデックスを巻き戻します。

LFN機能が有効な時は、f_readdir関数の呼び出しに先立ってFILINFO構造体の`lfname`と`lfsize`が有効な値で初期化されていなければなりません。`lfname`はLFNを格納するバッファで、`lfsize`はそのバッファ・サイズ(文字数)です。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。

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

また、`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;
    #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 (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;
    }

#### 参照

`f_opendir, f_stat, FILINFO, DIR`

戻る