mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-08-24 16:17:50 +00:00
FatFs: Update to R0.12a.
This commit is contained in:
@@ -28,7 +28,7 @@ FRESULT f_readdir (
|
||||
<dt>dp</dt>
|
||||
<dd><tt>f_opendir</tt>関数で作成された有効なディレクトリ オブジェクトへのポインタを指定します。</dd>
|
||||
<dt>fno</dt>
|
||||
<dd>読み出したディレクトリ項目を格納するファイル情報構造体へのポインタを指定します。</dd>
|
||||
<dd>読み出したディレクトリ項目を格納する<a href="sfileinfo.html">ファイル情報構造体</a>へのポインタ、またはヌル ポインタを指定します。</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
@@ -48,17 +48,16 @@ FRESULT f_readdir (
|
||||
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p>ディレクトリの項目(ファイルおよびサブ ディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fno->fname[]</tt>にヌル文字列が返されます。<tt class="arg">fno</tt>にヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。</p>
|
||||
<p>ドット エントリ(<tt>"."</tt>と<tt>".."</tt>)は、相対パスが有効なとき(<tt><a href="config.html#fs_rpath">_FS_RPATH</a> >= 1</tt>)にのみ出力に現れます。</p>
|
||||
<p>LFN機能が有効な時は、この関数の呼び出しに先立って<tt>fno->lfname</tt>と<tt>fno->lfsize</tt>が有効な値で初期化されていなければなりません。<tt>lfname</tt>はLFNを格納するバッファを示し、<tt>lfsize</tt>はそのバッファの要素数を示します。LFNを読み出す必要がないときは、<tt>lfname</tt>にヌル ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。</p>
|
||||
<p>ディレクトリの項目(ファイルおよびサブ ディレクトリ)の情報を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fno->fname[]</tt>にヌル文字列が返されます。<tt class="arg">fno</tt>にヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。サブ ディレクトリのドット エントリ(<tt>"."</tt>と<tt>".."</tt>)は、出力に現れません。</p>
|
||||
<p>LFN構成では、<tt>altname[]</tt>が新たに定義され、そのオブジェクトの短いファイル名がストアされます。次の条件のときは長いファイル名を返せないので<tt>fname[]</tt>に短いファイル名がストアされ、<tt>altname[]</tt>はヌル文字列になります。</p>
|
||||
<ul>
|
||||
<li>その項目にLFNが存在しない。このとき、<tt>fname[]</tt>に英小文字が含まれる場合があります。</li>
|
||||
<li>LFNの長さに対してLFN格納バッファまたはLFN操作バッファのサイズが不十分。</li>
|
||||
<li>LFNに現在のOEMコードで表現できない文字が含まれている。(非Unicode構成のとき)</li>
|
||||
<li>オブジェクトが長いファイル名を持っていない。(exFATボリュームでは該当せず)</li>
|
||||
<li><tt>_MAX_LFN</tt>の設定がその長いファイル名の長さに対して不十分 (<tt>_MAX_LFN == 255</tt>では該当せず)</li>
|
||||
<li>長いファイル名にANSI/OEMコードに無い文字が含まれている。(<tt>_LFN_UNICODE == 1</tt>では該当せず)</li>
|
||||
</ul>
|
||||
<p>exFATボリュームのディレクトリを読み出すとき、構成によっては問題が発生します。exFATでは短いファイル名がサポートされません。つまり、上記の条件のとき代わりに返すファイル名が無いということです。このような場合は<tt>fname[]</tt>に"?"が返され、そのオブジェクトにアクセスできないことを示します。この問題を避けるには、FatFsの構成を<tt>_LFN_UNICODE = 1</tt>および<tt>_MAX_LFN = 255</tt>として長いファイル名に完全対応とする必要があります。</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="para comp">
|
||||
<h4>対応情報</h4>
|
||||
<p><tt>_FS_MINIMIZE <= 1</tt>のときに使用可能です。</p>
|
||||
@@ -68,44 +67,50 @@ FRESULT f_readdir (
|
||||
<div class="para use">
|
||||
<h4>使用例</h4>
|
||||
<pre>
|
||||
FATFS fs;
|
||||
char buff[256];
|
||||
|
||||
FRESULT scan_files (
|
||||
char* path <span class="c">/* 開始ノード (ワークエリアとしても使用) */</span>
|
||||
)
|
||||
{
|
||||
FRESULT res;
|
||||
FILINFO fno;
|
||||
DIR dir;
|
||||
int i;
|
||||
char *fn; <span class="c">/* 非Unicode構成を想定 */</span>
|
||||
<span class="k">#if</span> _USE_LFN
|
||||
static char lfn[_MAX_LFN + 1];
|
||||
fno.lfname = lfn;
|
||||
fno.lfsize = sizeof lfn;
|
||||
<span class="k">#endif</span>
|
||||
UINT i;
|
||||
static FILINFO fno;
|
||||
|
||||
|
||||
res = f_opendir(&dir, path); <span class="c">/* ディレクトリを開く */</span>
|
||||
if (res == FR_OK) {
|
||||
i = strlen(path);
|
||||
for (;;) {
|
||||
res = f_readdir(&dir, &fno); <span class="c">/* ディレクトリ項目を1個読み出す */</span>
|
||||
if (res != FR_OK || fno.fname[0] == 0) break; <span class="c">/* エラーまたは項目無しのときは抜ける */</span>
|
||||
if (fno.fname[0] == '.') continue; <span class="c">/* ドットエントリは無視 */</span>
|
||||
<span class="k">#if</span> _USE_LFN
|
||||
fn = *fno.lfname ? fno.lfname : fno.fname;
|
||||
<span class="k">#else</span>
|
||||
fn = fno.fname;
|
||||
<span class="k">#endif</span>
|
||||
if (fno.fattrib & AM_DIR) { <span class="c">/* ディレクトリ */</span>
|
||||
sprintf(&path[i], "/%s", fn);
|
||||
res = scan_files(path);
|
||||
path[i] = 0;
|
||||
i = strlen(path);
|
||||
sprintf(&path[i], "/%s", fno.fname);
|
||||
res = scan_files(path); <span class="c">/* 一つ下へ */</span>
|
||||
if (res != FR_OK) break;
|
||||
path[i] = 0;
|
||||
} else { <span class="c">/* ファイル */</span>
|
||||
printf("%s/%s\n", path, fn);
|
||||
printf("%s/%s\n", path, fno.fname);
|
||||
}
|
||||
}
|
||||
f_closedir(&dir);
|
||||
f_closedir(&dir)
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
int main (void)
|
||||
{
|
||||
FRESULT res;
|
||||
|
||||
|
||||
res = f_mount(&fs, "", 1);
|
||||
if (res == FR_OK) {
|
||||
strcpy(buff, "/");
|
||||
res = scan_files(buff);
|
||||
}
|
||||
|
||||
return res;
|
||||
|
Reference in New Issue
Block a user