FatFs R0.12, released April 12, 2016
This commit is contained in:
+78
-66
@@ -17,6 +17,7 @@
|
||||
<li><a href="#memory">メモリ使用量</a></li>
|
||||
<li><a href="#reduce">モジュール サイズの縮小</a></li>
|
||||
<li><a href="#lfn">長いファイル名</a></li>
|
||||
<li><a href="#exfat">exFATファイル システム</a></li>
|
||||
<li><a href="#unicode">Unicode入出力への対応</a></li>
|
||||
<li><a href="#reentrant">リエントランシー</a></li>
|
||||
<li><a href="#dup">多重ファイル アクセス</a></li>
|
||||
@@ -43,7 +44,7 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
|
||||
<p>下に示す依存関係図は、FatFsモジュール利用の組み込みシステムにおける代表的な構成を示します。</p>
|
||||
<p><img src="../img/modules.png" width="580" height="280" alt="システム構成図"></p>
|
||||
<p>(a) FatFs用に書かれたディスク モジュールがある場合は、そのまま追加するだけです。 (b) しかし、多くの既存のディスク モジュールはそのAPIをFatFsに合わせるため、グルー関数が必要になるでしょう。</p>
|
||||
<p><img src="../img/funcs.png" width="680" height="420" alt="functional diagram"></p>
|
||||
<p><img src="../img/funcs.png" width="750" height="420" alt="functional diagram"></p>
|
||||
|
||||
<h4>ユーザの作成する関数</h4>
|
||||
<p>ポーティング作業は、要求されるデバイス制御関数を用意することが全てで、それ以外にすることは何もありません。既に動作しているデバイス制御モジュールがあるなら、そのAPIをFatFsに合わせるかグルー関数を介してつなぐだけで済みますが、無い場合はほかから移植するか最初から書くかする必要があります。定義されている全ての関数が常に必要なわけではありません。例えば、リード オンリ構成では書き込み系関数は必要ありません。次の表に構成オプションと要求される関数の対応を示します。</p>
|
||||
@@ -63,13 +64,13 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
|
||||
<div class="para doc" id="limits">
|
||||
<h3>限界値</h3>
|
||||
<ul>
|
||||
<li>FATタイプ: FAT12, FAT16, FAT32。</li>
|
||||
<li>ファイルシステム: FAT12, FAT16, FAT32(r0.0) および exFAT(r1.0)。</li>
|
||||
<li>同時オープン ファイル数: 無制限。(利用可能メモリによる)</li>
|
||||
<li>同時マウント ボリューム数: 最大 10。</li>
|
||||
<li>ファイル サイズ: 最大 4G-1バイト。</li>
|
||||
<li>ボリューム サイズ: 最大 2Tバイト(512バイト/セクタ時)。</li>
|
||||
<li>クラスタ サイズ: 最大 64Kバイト(512バイト/セクタ時)。</li>
|
||||
<li>セクタ サイズ: 512, 1024, 2048, 4096バイト。</li>
|
||||
<li>ファイル サイズ: 最大 4GiB-1(FATボリューム) または 事実上無制限(exFATボリューム)。</li>
|
||||
<li>ボリューム サイズ: 最大 2TiB (512B/セクタ時)。</li>
|
||||
<li>クラスタ サイズ: 最大 128セクタ (FATボリューム) または 32768セクタ (exFATボリューム)。</li>
|
||||
<li>セクタ サイズ: 512B, 1KiB, 2KiB, 4KiB。</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -78,69 +79,72 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
|
||||
<p>次の表にいくつかのターゲットにおけるメモリ使用量の例を示します。テスト時の構成オプションはその下の通りです。数値の単位はバイトで、<em>V</em>はボリューム数、<em>F</em>は同時オープン ファイル数を示します。コンパイラの最適化オプションはコード サイズとしています。</p>
|
||||
<table class="lst2">
|
||||
<tr><th></th><th>ARM7<small><br>32bit</small></th><th>ARM7<small><br>Thumb</small></th><th>CM3<small><br>Thumb-2</small></th><th>AVR</th><th>H8/300H</th><th>PIC24</th><th>RL78</th><th>V850ES</th><th>SH-2A</th><th>RX600</th><th>IA-32</th></tr>
|
||||
<tr class="cal"> <td>Compiler</td><td>GCC</td><td>GCC</td><td>GCC</td><td>GCC</td><td>CH38</td><td>C30</td><td>CC78K0R</td><td>CA850</td><td>SHC</td><td>RXC</td><td>VC6</td></tr>
|
||||
<tr class="cal"> <td>_WORD_ACCESS</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>1</td><td>1</td></tr>
|
||||
<!-- ARM Thumb CM3 AVR H8 PIC24 RL78 V850ES SH-2A RX600 IA-32 -->
|
||||
<tr class="lst3 ral"><td class="cal">text (Full, R/W)</td><td>10.6k</td><td>7.1k</td><td>6.5k</td><td>13.3k</td><td>10.9k</td><td>11.7k</td><td>13.3k</td><td>8.1k</td><td>9.0k</td><td>6.0k</td><td>7.9k</td></tr>
|
||||
<tr class="ral"> <td class="cal">text (Min, R/W)</td> <td>6.7k</td><td>4.6k</td><td>4.2k</td> <td>8.6k</td> <td>7.3k</td> <td>7.7k</td> <td>9.1k</td><td>5.3k</td><td>5.8k</td><td>3.9k</td><td>5.2k</td></tr>
|
||||
<tr class="ral"> <td class="cal">text (Full, R/O)</td> <td>4.8k</td><td>3.2k</td><td>2.9k</td> <td>6.2k</td> <td>5.2k</td> <td>5.5k</td> <td>6.5k</td><td>3.8k</td><td>4.0k</td><td>2.9k</td><td>3.7k</td></tr>
|
||||
<tr class="ral"> <td class="cal">text (Min, R/O)</td> <td>3.6k</td><td>2.5k</td><td>2.3k</td> <td>4.6k</td> <td>4.1k</td> <td>4.3k</td> <td>5.0k</td><td>3.0k</td><td>3.1k</td><td>2.2k</td><td>2.9k</td></tr>
|
||||
<tr class="ral"> <td class="cal">bss</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*2 + 2</td><td>V*4 + 2</td><td>V*2 + 2</td><td>V*2 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td></tr>
|
||||
<tr class="ral"> <td class="cal">Work area<br>(_FS_TINY == 0)</td><td>V*560<br>+ F*550</td><td>V*560<br>+ F*550</td><td>V*560<br>+ F*550</td><td>V*560<br>+ F*544</td><td>V*560<br>+ F*550</td><td>V*560<br>+ F*544</td><td>V*560<br>+ F*544</td><td>V*560<br>+ F*544</td><td>V*560<br>+ F*550</td><td>V*560<br>+ F*550</td><td>V*560<br>+ F*550</td></tr>
|
||||
<tr class="ral"> <td class="cal">Work area<br>(_FS_TINY == 1)</td><td>V*560<br>+ F*36</td><td>V*560<br>+ F*36</td><td>V*560<br>+ F*36</td><td>V*560<br>+ F*32</td><td>V*560<br>+ F*36</td><td>V*560<br>+ F*32</td><td>V*560<br>+ F*32</td><td>V*560<br>+ F*36</td><td>V*560<br>+ F*36</td><td>V*560<br>+ F*36</td><td>V*560<br>+ F*36</td></tr>
|
||||
<tr class="cal"> <td>Compiler</td><td>GCC</td><td>GCC</td><td>GCC</td><td>GCC</td><td>CH38</td><td>C30</td><td>CC78K0R</td><td>CA850</td><td>SHC</td><td>RXC</td><td>MSC</td></tr>
|
||||
<!-- ARM Thumb CM3 AVR H8 PIC24 RL78 V850ES SH-2A RX600 IA-32 -->
|
||||
<tr class="ral"><td class="cal">text (Full, R/W)</td><td>10.1k</td><td>6.6k</td><td>6.2k</td><td>12.1k</td><td>10.5k</td><td>11.2k</td><td>12.6k</td><td>8.5k</td><td>8.7k</td><td>6.3k</td><td>8.4k</td></tr>
|
||||
<tr class="ral"><td class="cal">text (Min, R/W)</td> <td>6.6k</td><td>4.5k</td><td>4.2k</td> <td>7.9k</td> <td>7.0k</td> <td>7.6k</td> <td>8.8k</td><td>5.9k</td><td>5.8k</td><td>4.3k</td><td>5.8k</td></tr>
|
||||
<tr class="ral"><td class="cal">text (Full, R/O)</td> <td>4.8k</td><td>3.1k</td><td>2.9k</td> <td>5.8k</td> <td>5.1k</td> <td>5.5k</td> <td>6.4k</td><td>4.1k</td><td>4.0k</td><td>3.1k</td><td>4.0k</td></tr>
|
||||
<tr class="ral"><td class="cal">text (Min, R/O)</td> <td>3.5k</td><td>2.4k</td><td>2.3k</td> <td>4.4k</td> <td>3.9k</td> <td>4.2k</td> <td>5.0k</td><td>3.3k</td><td>3.1k</td><td>2.4k</td><td>3.1k</td></tr>
|
||||
<tr class="ral"><td class="cal">bss</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*2 + 2</td><td>V*4 + 2</td><td>V*2 + 2</td><td>V*2 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td><td>V*4 + 2</td></tr>
|
||||
<tr class="ral"><td class="cal">Work area<br><small>(_FS_TINY == 0)</small></td><td>V*564<br>+ F*552</td><td>V*564<br>+ F*552</td><td>V*564<br>+ F*552</td><td>V*560<br>+ F*546</td><td>V*560<br>+ F*546</td><td>V*560<br>+ F*546</td><td>V*560<br>+ F*546</td><td>V*564<br>+ F*552</td><td>V*564<br>+ F*552</td><td>V*564<br>+ F*552</td><td>V*564<br>+ F*552</td></tr>
|
||||
<tr class="ral"><td class="cal">Work area<br><small>(_FS_TINY == 1)</small></td><td>V*564<br>+ F*40</td><td>V*564<br>+ F*40</td><td>V*564<br>+ F*40</td><td>V*560<br>+ F*34</td><td>V*560<br>+ F*34</td><td>V*560<br>+ F*34</td><td>V*560<br>+ F*34</td><td>V*564<br>+ F*40</td><td>V*564<br>+ F*40</td><td>V*564<br>+ F*40</td><td>V*564<br>+ F*40</td></tr>
|
||||
</table>
|
||||
<p>These are the memory usage on some target systems with following condition. The memory sizes are in unit of byte, <em>V</em> denotes option <tt>_VOLUMES</tt> and <em>F</em> denotes number of open files. All samples here are optimezed in code size.</p>
|
||||
<pre>
|
||||
FatFs R0.11 options:
|
||||
FatFs R0.12 options:
|
||||
_FS_READONLY 0 (R/W) or 1 (R/O)
|
||||
_FS_MINIMIZE 0 (Full basic function) or 3 (Minimized function)
|
||||
_VOLUMES V (Number of logical drives to be used)
|
||||
_WORD_ACCESS 0 or 1 (Set by processor architecture)
|
||||
(Any other options are left not changed from default setting)
|
||||
_FS_MINIMIZE 0 (Full, with all basic functions) or 3 (Min, with fully minimized)
|
||||
_FS_TINY 0 (Default) or 1 (Tiny file object)
|
||||
And any other options are left not changed from default setting.
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="reduce">
|
||||
<h3>モジュール サイズの縮小</h3>
|
||||
<p>次の表は<a href="config.html">構成オプション</a>の設定値によりどの機能が削除されるかを示します。使用するAPI関数の行にxが無ければその関数は使用可能です。</p>
|
||||
<p>次の表は<a href="config.html">構成オプション</a>の設定値によりどの機能が削除されるかを示します。API関数の行にxが無ければその関数は使用可能です。</p>
|
||||
<table class="lst2">
|
||||
<tr><td rowspan="2">Function</td><td colspan="4">_FS_MINIMIZE</td><td colspan="2">_FS_READONLY</td><td colspan="2">_USE_STRFUNC</td><td colspan="3">_FS_RPATH</td><td colspan="2">_USE_LABEL</td><td colspan="2">_USE_MKFS</td><td colspan="2">_USE_FORWARD</td><td colspan="2">_MULTI_PARTITION</td></tr>
|
||||
<tr><td>0</td><td>1</td><td>2</td><td>3</td><td>0</td><td>1</td><td>0 </td><td>1/2</td><td>0</td><td>1</td><td>2</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0/1</td><td>2</td></tr>
|
||||
<tr class="lst3"><td>f_mount</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_open</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_close</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_read</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_write</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_sync</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_lseek</td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_opendir</td><td></td><td></td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_closedir</td><td></td><td></td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_readdir</td><td></td><td></td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_stat</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_getfree</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_truncate</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_unlink</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_mkdir</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_chmod</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_utime</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_rename</td><td></td><td>x</td><td>x</td><td>x</td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_chdir</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_chdrive</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_getcwd</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_getlabel</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_setlabel</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_forward</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_mkfs</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_fdisk</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td>x</td><td></td></tr>
|
||||
<tr><td>f_putc</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_puts</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_printf</td><td></td><td></td><td></td><td></td><td></td><td>x</td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>f_gets</td><td></td><td></td><td></td><td></td><td></td><td></td><td>x</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
||||
<tr><td rowspan="2">Function</td><td colspan="4">_FS_<br>MINIMIZE</td><td colspan="2">_FS_<br>READONLY</td><td colspan="2">_USE_<br>STRFUNC</td><td colspan="3">_FS_<br>RPATH</td><td colspan="2">_USE_<br>FIND</td><td colspan="2">_USE_<br>CHMOD</td><td colspan="2">_USE_<br>EXPAND</td><td colspan="2">_USE_<br>LABEL</td><td colspan="2">_USE_<br>MKFS</td><td colspan="2">_USE_<br>FORWARD</td><td colspan="2">_MULTI_<br>PARTITION</td></tr>
|
||||
<tr> <td>0</td><td>1</td><td>2</td><td>3</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>2</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td><td>0</td><td>1</td></tr>
|
||||
<tr class="lst3">
|
||||
<td>f_mount</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_open</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_close</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_read</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_write</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_sync</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_lseek</td> <td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_opendir</td> <td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_closedir</td> <td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_readdir</td> <td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_findfirst</td><td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_findnext</td> <td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_stat</td> <td> </td><td>x</td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_getfree</td> <td> </td><td>x</td><td>x</td><td>x</td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_truncate</td> <td> </td><td>x</td><td>x</td><td>x</td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_unlink</td> <td> </td><td>x</td><td>x</td><td>x</td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_mkdir</td> <td> </td><td>x</td><td>x</td><td>x</td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_rename</td> <td> </td><td>x</td><td>x</td><td>x</td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_chdir</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_chdrive</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_getcwd</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_chmod</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_utime</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_getlabel</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_setlabel</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_expand</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_forward</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_mkfs</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_fdisk</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td>x</td><td> </td></tr>
|
||||
<tr><td>f_putc</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_puts</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_printf</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>f_gets</td> <td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td>x</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="lfn">
|
||||
<h3>長いファイル名</h3>
|
||||
<p>FatFsモジュールは、長いファイル名(LFN)をサポートします。ファイルに付けられた2つの異なる名前(短いファル名と長いファイル名)は、<tt>f_readdir</tt>関数を除くファイル操作関数において透過です。デフォルト構成では、LFN機能はOFFになっています。LFN機能を有効にするには、<tt><a href="config.html#use_lfn">_USE_LFN</a></tt>を1,2または3に設定し、<tt>option/unicode.c</tt>をプロジェクトに追加します。LFN機能は、加えてある程度のワーク エリア(LFN操作バッファ)を必要とします。バッファ長は使用できるメモリに応じて<tt><a href="config.html#max_lfn">_MAX_LFN</a></tt>オプションで構成されることができます。LFNの長さは最大255文字に達するので、LFN完全対応のためには<tt>_MAX_LFN</tt>は255に設定されるべきです。与えられたファイル名に対してバッファ長が不足した場合、ファイル関数は<tt>FR_INVALID_NAME</tt>で失敗します。</p>
|
||||
<p>FatFsモジュールは、長いファイル名(LFN)をサポートします。ファイルに付けられた2つの異なる名前(短いファル名と長いファイル名)は、<tt>f_readdir</tt>関数を除くファイル操作関数において透過です。デフォルト構成では、LFN機能はOFFになっています。LFN機能を有効にするには、<tt><a href="config.html#use_lfn">_USE_LFN</a></tt>を1,2または3に設定し、<tt>option/unicode.c</tt>をプロジェクトに追加します。LFN機能は、加えてある程度のワーク エリア(LFN操作バッファ)を必要とします。バッファ長は使用できるメモリに応じて<tt><a href="config.html#max_lfn">_MAX_LFN</a></tt>で構成されることができます。LFNの長さは最大255文字に達するので、LFN完全対応のためには<tt>_MAX_LFN</tt>は255に設定されるべきです。与えられたファイル名に対してバッファ長が不足した場合、ファイル関数は<tt>FR_INVALID_NAME</tt>で失敗します。</p>
|
||||
<p>ファイル関数に再入を行う条件の下でLFN機能を使用する場合は、<tt>_USE_LFN</tt>は2または3に設定されなければなりません。この場合、ファイル関数はワーク エリアを動的に確保(スタックまたはヒープ)します。ワーク エリアのサイズは、<tt>(_MAX_LFN + 1) * 2</tt>バイトになるので、スタック等のサイズはそれを考慮した十分な余裕がなければなりません。</p>
|
||||
<table class="lst2 rset">
|
||||
<caption>LFN構成 at CM3</caption>
|
||||
@@ -152,21 +156,29 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
|
||||
<tr><td>950(Big5)</td><td>+111k</td></tr>
|
||||
</table>
|
||||
<p>LFN機能の上手な使い方は、それを使わないということです。実際、組み込み用途ではLFN機能がどうしても必要になるということはほとんど無いはずです。LFNを有効にすると、選択されたコード ページに応じてモジュール サイズが増大します。右の表に各コード ページにおけるLFNを有効にしたときのモジュール サイズの違いを示します。特に、CJK地域では数万の文字が使われていますが、不幸なことにそれは巨大なOEM-Unicode相互変換テーブルを要求し、モジュール サイズは劇的に増大します。その結果、それらのコード ページにおいてLFNを有効にしたFatFsモジュールは、多くの8ビット マイコンにインプリメントすることができません。</p>
|
||||
<p>LFN機能のハードルはそれだけではありません。マイクロソフト社はFATファイル システムについていくつかの特許を保有しています。いずれもLFN機能の実装に関するもので、その利用に対して$0.25/unitのライセンス料を要求しています。このため、商用製品でLFN機能を利用するときは、最終仕向地によってはライセンスが必要になります。最近のFAT32ドライバの多くはLFN機能を含んでいるため、それらの使用に当たってライセンスが必要になりますが、FatFsではLFN機能を構成オプションで任意にON/OFFできるため、無効にしてライセンス問題を回避することもできます。</p>
|
||||
<p>LFN機能のハードルはそれだけではありません。マイクロソフト社はFATファイル システムについていくつかの特許を保有しています。いずれもLFN機能の実装に関するもので、その利用に対して$0.25/unitのライセンス料を要求しています。このため、商用製品でLFN機能を利用する場合は、製品の最終仕向地によってはライセンスが必要になります。最近のFAT32ドライバの多くはLFN機能を含んでいるため、それらの使用に当たってライセンスが必要になりますが、FatFsは構成オプションでLFN機能を任意にON/OFFできるため、無効にしてライセンス問題を回避することもできます。</p>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="unicode">
|
||||
<h3>Unicode入出力への対応</h3>
|
||||
<p>FatFs API上におけるファイル名等の文字列データの入出力は、デフォルトではANSI/OEMコードで行われますが、これをUnicode(UTF-16)に切り替えることもできます(<tt><a href="config.html#lfn_unicode">_LFN_UNICODE</a></tt>オプションで設定)。つまり、これはFatFsがLFN機能に完全対応していることを意味します。Unicodeのファイル名に関する詳細は、<a href="filename.html#uni">パス名のフォーマット</a>を参照してください。</p>
|
||||
<p>FatFs API上におけるファイル名等の文字列データの入出力は、デフォルトではANSI/OEMコードで行われますが、これをUnicode(UTF-16)に切り替えることもできます(<tt><a href="config.html#lfn_unicode">_LFN_UNICODE</a></tt>で設定)。つまり、これはFatFsがLFN機能に完全対応していることを意味します。Unicodeのファイル名に関する詳細は、<a href="filename.html#uni">パス名のフォーマット</a>を参照してください。</p>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="exfat">
|
||||
<h3>exFATファイル システム</h3>
|
||||
<p>exFAT(Microsoft's Extended File Allocation Table)ファイル システムは、既に組み込みシステムや情報家電で広く使われているFATファイル システムを置き換える目的で開発されました。exFATは、64GiB以上のSDメモリ カードで標準ファイル システムに採用されるなど、FATに並びリムーバブル メディアの標準ファイル システムの一つとなりつつあります。</p>
|
||||
<p>exFATボリュームでは、FATボリュームで制約となっていた4GiB以上のサイズのファイルを扱え、ファイル システムのオーバーヘッド(特にファイル アロケーション ディレイ)も大幅に低減され、書き込みスループットがFATより向上しています。しかし、現リビジョンのFatFsでは、実装上の理由から不連続ファイルへのサイズ拡大を伴う書き込み時のとき、スループットがFATより低下します。<tt>f_expand</tt>関数による連続領域の割り当て機能は、この問題の回避に有効かもしれません。</p>
|
||||
<p>exFATはマイクロソフト社が開発したものなので、マイクロソフト社はexFATについていくつかの特許を保有しています。FatFsのexFAT機能は、それの US. Pat. App. Pub. No. 2009/0164440 A1 に基づいた実装です。このため、商用製品でexFAT機能を利用する場合、製品の最終仕向地によってはライセンスが必要になります。最近のFATドライバの多くはexFAT機能を含んでいるため、それらの使用に当たってライセンスが必要になりますが、FatFsは構成オプションでexFAT機能を任意にON/OFFできるため、無効にしてライセンス問題を回避することもできます。</p>
|
||||
<p><em>exFATを有効にすると、FatFsモジュールのC89互換は失われます(64ビット整数型が必要なため)。</em></p>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="reentrant">
|
||||
<h3>リエントランシー</h3>
|
||||
<p>互いに異なるボリュームに対するファイル操作は構成にかかわらずリエントラントで、常に同時平行に動作できます。</p>
|
||||
<p>同じボリュームに対してはデフォルトではリエントラントではありませんが、<tt><a href="config.html#fs_reentrant">_FS_REENTRANT</a></tt>オプションでリエントラント(スレッド セーフ)にすることはできます。この場合、OS依存の同期オブジェクト操作関数<tt>ff_cre_syncobj, ff_del_syncobj, ff_req_grant, ff_rel_grant</tt>関数もまたプロジェクトに追加されなければなりません。サンプル コードと解説は<tt>option/syncobj.c</tt>にあります。</p>
|
||||
<p>互いに異なるボリュームに対するファイル操作は、<tt>_USE_LFN == 1</tt>を除いて構成にかかわらずリエントラントで、常に同時平行に動作できます。</p>
|
||||
<p>同じボリュームに対してはデフォルトではリエントラントではありませんが、<tt><a href="config.html#fs_reentrant">_FS_REENTRANT</a></tt>でリエントラント(スレッド セーフ)にすることはできます。この場合、OS依存の同期オブジェクト操作関数<tt>ff_cre_syncobj, ff_del_syncobj, ff_req_grant, ff_rel_grant</tt>関数もまたプロジェクトに追加されなければなりません。サンプル コードと解説は<tt>option/syncobj.c</tt>にあります。</p>
|
||||
<p>この場合、あるタスクがボリュームを使用中に他のタスクからそのボリュームに対するファイル関数が呼び出されると、そのアクセスは先のタスクがファイル関数を抜けるまでサスペンドされます。待ち時間が<tt>_TIMEOUT</tt>で指定された期間を越えた場合、その関数は<tt>FR_TIMEOUT</tt>でアボートします。いくつかのRTOSではタイムアウト機能はサポートされないかも知れません。</p>
|
||||
<p>ひとつの例外が<tt>f_mount, f_mkfs, f_fdisk</tt>関数にあります。これらのボリューム制御関数は同じボリューム(または関連する物理ドライブ)に対してリエントラントではありません。これらの関数を使用するときは、アプリケーション レベルで排他制御しなければなりません。</p>
|
||||
<p>注: このセクションはFatFsモジュールそれ自体のリエントランシーについて説明しています。その下位のディスクI/Oモジュールについては、FatFs APIに再入を行う条件では少なくともスレッド セーフである必要があります。</p>
|
||||
<p>注: このセクションはFatFsモジュールそれ自体のリエントランシーについて説明しています。<tt>_FS_REENTRANT</tt>は、各ファイル システム オブジェクトの排他制御を行うのみで、下位のディスク関数への再入を防止するものではありません。たとえば、シングル ボリューム構成では<tt>disk_status</tt>関数のみ再入される可能性があり、マルチ ボリューム構成ではどのディスク関数も再入される可能性があります。このように、複数のタスクから同時にFatFs APIを使う条件では、ディスクI/Oモジュールはスレッド セーフである必要があります。</p>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="dup">
|
||||
@@ -203,7 +215,7 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
|
||||
<p>フラッシュ メモリ メディアの書き込み速度はシングル セクタ書き込みの時に最も低いものになり、一回のトランザクションで転送されるセクタ数が大きくなるほど書き込み速度は向上します(図6)。この効果はバス速度が高速になるほど大きく、10倍以上の差が現れることも珍しくありません。<a href="../img/rwtest2.png">テスト結果</a>は、マルチ セクタ書き込み(W:16K, 32 sectors)がシングル セクタ書き込み(W:100, 1 sector)よりどの程度速いかを明確に示しています。大容量メディアほどシングル セクタ書き込みが遅くなる点もまた重要です。書き込みトランザクションの回数はまた、メディアの寿命にも影響してきます。つまり、同じ量のデータを書き込む場合、図6上のシングル セクタ書き込みは、図6下のマルチ セクタ書き込みに比べて16倍早くフラッシュ メモリ メディアを消耗させてしまうということです。</p>
|
||||
<p>このように、アプリケーションはなるべく大きなブロック(クラスタ サイズまたは2の累乗セクタ境界にアライメントした)で読み書きを行う必要があります。もちろん、アプリケーションからメディアに至る全てのレイヤがマルチ セクタ転送に対応していないと意味がありません。残念ながら、既存のオープン ソースのドライバの多くはマルチ セクタ転送に未対応です。なお、FatFsモジュールおよびサンプル ドライバはマルチ セクタ転送に対応しています。</p>
|
||||
<h4>明示的なメモリ消去</h4>
|
||||
<p>通常のファイル消去では、記録されたデータに対して何らかの制御が行われるわけではなく、単にFAT上に未使用クラスタとして記録されているだけです。このため、ファイルが消去されたあともそれらは有効なメモリ ブロックとしてフラッシュ メモリ上に残ります。そこで、ファイルを消去するとき、占有していたデータ セクタを明示的に消去(つまり未使用ブロックにする)することにより、メディア内の空きブロックを増やすことができます。これにより、次にそのブロックに書き込むときの消去動作が無くなり、書き込み性能が向上する可能性があります。また、ウェアレベリングに使えるブロックが増え、メディアの耐久性も向上するかも知れません。この機能を有効にするには、構成オプションの<tt><a href="config.html#use_trim">_USE_TRIM</a></tt>に1を設定します。これはフラッシュ メモリ メディアの内部動作に期待した制御なので、効果があるとは限りません。また、ファイル消去の時間が延びることも考慮に入れるべきです。</p>
|
||||
<p>通常のファイル消去では、記録されたデータに対して何らかの処理が行われるわけではなく、単にFAT上にその領域を未使用と記録しているだけです。このため、ファイルが消去されたあともそれらは有効なデータ ブロックとしてフラッシュ メモリ上に残ります。そこで、ファイルを消去するとき、占有していたデータ セクタを明示的に消去(つまり未使用ブロックにする)することにより、メディア内の空きブロックを増やすことができます。これにより、次にそのブロックに書き込むときの消去動作が無くなり、書き込み性能が向上する可能性があります。また、ウェアレベリングに使えるブロックが増え、メディアの耐久性も向上するかも知れません。この機能を有効にするには、<tt><a href="config.html#use_trim">_USE_TRIM</a></tt>に1を設定します。これはフラッシュ メモリ ドライブの内部動作に期待した制御なので、効果があるとは限りません。また、ファイル消去の時間が延びることも考慮に入れるべきです。</p>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="critical">
|
||||
@@ -235,7 +247,7 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
|
||||
<ol>
|
||||
<li><a href="../img/app1.c">追記モードでのオープン/新規作成</a></li>
|
||||
<li><a href="../img/app2.c">ディレクトリを空にする</a></li>
|
||||
<li><a href="../img/app3.c">ファイルに連続領域を割り当てる</a></li>
|
||||
<li><a href="../img/app3.c">ファイルに連続領域を割り当てる</a>(R0.11a以前)</li>
|
||||
<li><a href="../img/app4.c">ディスクI/Oモジュールの機能/互換性チェッカー</a></li>
|
||||
<li><a href="../img/mkfatimg.zip">FATイメージ作成ツール</a></li>
|
||||
</ol>
|
||||
@@ -243,14 +255,14 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
|
||||
|
||||
<div class="para doc" id="license">
|
||||
<h3>FatFsのライセンスについて</h3>
|
||||
<p>ソース ファイルにライセンス条件が記述されているので、利用の際はそれに従うこと。原文は英語ですが、参考までに以下に日本語訳を示しておきます。</p>
|
||||
<p>FatFsは、作者(ChaN)の個人プロジェクトとして開発されています。現在のリビジョンにおいてコントリビューターはいないため、作者の書いたソース コード以外は含まれません。ソース ファイルにライセンス条件が記述されているので、利用の際はそれに従うこと。原文は英語ですが、参考までに以下に日本語訳を示しておきます。</p>
|
||||
<pre>
|
||||
/*----------------------------------------------------------------------------/
|
||||
/ FatFs - FAT file system module R0.11 (C)ChaN, 2015
|
||||
/ FatFs - FAT file system module R0.12 (C)ChaN, 2016
|
||||
/-----------------------------------------------------------------------------/
|
||||
/ FatFsモジュールはフリーソフトウェアで、次に示す条件の下に公開されています。
|
||||
/
|
||||
/ Copyright (C) 2015, ChaN, all right reserved.
|
||||
/ Copyright (C) 2016, ChaN, all right reserved.
|
||||
/
|
||||
/ 1. ソースコードで再配布するときは、その中に上記の著作権表示、この条文、および
|
||||
/ 次の免責事項を保持すること
|
||||
@@ -261,7 +273,7 @@ _WORD_ACCESS 0 or 1 (Set by processor architecture)
|
||||
/ 損害についても、<em>責任を負いません</em>。
|
||||
/----------------------------------------------------------------------------*/
|
||||
</pre>
|
||||
<p>このようにFatFsはBSDライクなライセンスとしていますが、一つ大きな違いがあります。FatFsは主に組み込み向けとして開発されたため、バイナリ形式(ソース コードを含まない形式全て)での再配布については、商用での使いやすさを考慮して配布時の条件を設けていません。つまり、バイナリ配布の場合は、FatFsおよびそのライセンス文書についてドキュメントに明記してもしなくてもかまいません。これは、一条項BSDライセンスと等価ということです。もちろん、GNU GPLなどほとんど全てのオープン ソース ライセンスの下のプロジェクトにおいて共存可能です。FatFsに何らかの修正や拡張を加えてソース コードで再配布する場合は、矛盾しない他のオープン ソース ライセンス(GNU GPLや修正BSDライセンスなど)に変更することも可能です。</p>
|
||||
<p>このようにFatFsはBSDライクなライセンスとしていますが、一つ大きな違いがあります。FatFsは主に組み込み向けとして開発されたため、バイナリ形式(ソース コードを含まない形式全て)での再配布については、商用での使いやすさを考慮して配布時の条件を設けていません。つまり、バイナリ配布の場合は、FatFsおよびそのライセンス文書についてドキュメントに明記してもしなくてもかまいません。これは、一条項BSDライセンスと等価ということです。もちろん、GNU GPLなどほとんど全てのオープン ソース ライセンスの下のプロジェクトにおいて共存可能です。FatFsからフォークを作成し公開する場合は、矛盾しない他のオープン ソース ライセンス(GNU GPLや修正BSDライセンスなど)に変更することも可能です。</p>
|
||||
</div>
|
||||
|
||||
<p class="foot"><a href="../00index_j.html">戻る</a></p>
|
||||
|
||||
+17
-33
@@ -43,19 +43,25 @@ div.doc h4 {margin-top: 2em }
|
||||
</table>
|
||||
|
||||
<h4 id="use_find">_USE_FIND</h4>
|
||||
<p>フィルタ付きディレクトリ読み出し機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_findfirst</tt>、<tt>f_findnext</tt>関数が利用可能になります。</p>
|
||||
<p>フィルタ付きディレクトリ読み出し機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_findfirst</tt>、<tt>f_findnext</tt>関数が利用可能になります。<tt>_FS_MINIMIZE</tt>は、1以下でなければなりません。</p>
|
||||
|
||||
<h4 id="use_mkfs">_USE_MKFS</h4>
|
||||
<p>ボリューム作成機能の構成(0:無効 または 1:有効)。有効にすると<tt>f_mkfs</tt>関数が利用可能になります。</p>
|
||||
|
||||
<h4 id="use_fastseek">_USE_FASTSEEK</h4>
|
||||
<p>高速シーク機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_lseek</tt>、<tt>f_read</tt>、<tt>f_write</tt>関数の高速化モードが利用可能になります。詳しくは、<a href="lseek.html">こちら</a>を参照してください。</p>
|
||||
<p>高速シーク機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_lseek</tt>、<tt>f_read</tt>、<tt>f_write</tt>関数において高速化モードが利用可能になります。詳しくは、<a href="lseek.html">こちら</a>を参照してください。</p>
|
||||
|
||||
<h4 id="use_expand">_USE_EXPAND</h4>
|
||||
<p>連続領域割り当て機能の構成(0:無効 または 1:有効)。有効にすると<tt>f_expand</tt>関数が利用可能になります。<tt>_FS_READONLY</tt>は0でなければなりません。</p>
|
||||
|
||||
<h4 id="use_chmod">_USE_CHMOD</h4>
|
||||
<p>メタデータ操作機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_chmod</tt>、<tt>f_utime</tt>関数が利用可能になります。<tt>_FS_READONLY</tt>は0でなければなりません。</p>
|
||||
|
||||
<h4 id="use_label">_USE_LABEL</h4>
|
||||
<p>ボリューム ラベル操作機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_getlabel</tt>、<tt>f_setlabel</tt>関数が利用可能になります。</p>
|
||||
<p>ボリューム ラベル操作機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_getlabel</tt>、<tt>f_setlabel</tt>関数(<tt>_FS_READONLY == 0</tt>のとき)が利用可能になります。</p>
|
||||
|
||||
<h4 id="use_forward">_USE_FORWARD</h4>
|
||||
<p>ストリーミング読み出し機能の構成(0:無効 または 1:有効)。これと<tt>_FS_TINY</tt>を有効にすると、<tt>f_forward</tt>関数が利用可能になります。</p>
|
||||
<p>ストリーミング読み出し機能の構成(0:無効 または 1:有効)。これと<tt>_FS_TINY</tt>を1にすることで<tt>f_forward</tt>関数が利用可能になります。</p>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -92,13 +98,13 @@ div.doc h4 {margin-top: 2em }
|
||||
</table>
|
||||
|
||||
<h4 id="use_lfn">_USE_LFN</h4>
|
||||
<p>LFN(長いファイル名)対応を設定します。LFN機能を有効にするときは、Unicode操作関数<tt>option/unicode.c</tt>をプロジェクトに加える必要があります。また、LFN操作バッファ(<tt>(_MAX_LFN + 1) * 2</tt>バイトを占有)を使用します。バッファをスタックに確保するときは、スタック オーバ フローに注意する必要があります。ヒープに確保するときは、メモリ操作関数、<tt>ff_memalloc</tt>と<tt>ff_memfree</tt>(<tt>option/syscall.c</tt>にサンプルあり)、をプロジェクトに加える必要があります。</p>
|
||||
<p>LFN(長いファイル名)対応を設定します。LFN機能を有効にするときは、Unicode操作関数<tt>option/unicode.c</tt>をプロジェクトに加える必要があります。また、LFN操作のワーク エリアとして<tt>(_MAX_LFN + 1) * 2</tt>バイト(exFAT構成時はさらに608バイト)を使用します。このため、バッファをスタックに確保するときは、スタック オーバ フローに注意する必要があります。ヒープに確保するときは、メモリ操作関数(<tt>ff_memalloc</tt>と<tt>ff_memfree</tt>(<tt>option/syscall.c</tt>にサンプルあり))をプロジェクトに加える必要があります。</p>
|
||||
<table class="lst1">
|
||||
<tr><th>値</th><th>解説</th></tr>
|
||||
<tr><td>0</td><td>LFN機能を使わない。8.3形式の名前のみ使用可能。</td></tr>
|
||||
<tr><td>1</td><td>LFN機能を使う。LFN操作バッファは静的に確保。常にスレッド セーフではない。</td></tr>
|
||||
<tr><td>2</td><td>LFN機能を使う。LFN操作バッファはスタックから確保。</td></tr>
|
||||
<tr><td>3</td><td>LFN機能を使う。LFN操作バッファはヒープから確保。</td></tr>
|
||||
<tr><td>1</td><td>LFN機能を使う。ワーク エリアは静的に確保。常にスレッド セーフではない。</td></tr>
|
||||
<tr><td>2</td><td>LFN機能を使う。ワーク エリアはスタックに確保。</td></tr>
|
||||
<tr><td>3</td><td>LFN機能を使う。ワーク エリアはヒープに確保。</td></tr>
|
||||
</table>
|
||||
|
||||
<h4 id="max_lfn">_MAX_LFN</h4>
|
||||
@@ -169,6 +175,9 @@ div.doc h4 {margin-top: 2em }
|
||||
<h4 id="fs_tiny">_FS_TINY</h4>
|
||||
<p>ファイル データ転送バッファの構成(0:ノーマル または 1:タイニ)。タイニ構成では、ファイル オブジェクト<tt>FIL</tt>内のプライベート セクタ バッファが削除され、<tt>_MAX_SS</tt>バイト小さくなります。ファイル データの転送には、代わりにファイル システム オブジェクト<tt>FATFS</tt>内のボリューム共有セクタ バッファが使われます。</p>
|
||||
|
||||
<h4 id="fs_exfat">_FS_EXFAT</h4>
|
||||
<p>exFATのサポート(0:使用しない または 1:使用する)。exFATを使用するには、LFN機能を有効にしなければなりません。また、exFATの完全サポートのためには、<tt>_LFN_UNICODE = 1</tt>と<tt>_MAX_LFN = 255</tt>の設定が推奨されます。exFAT機能では64-bit整数を使用するため、これを有効にするとC89(ANSI C)互換が失われます。</p>
|
||||
|
||||
<h4 id="fs_nortc">_FS_NORTC</h4>
|
||||
<p>RTC機能の使用の設定(0:使用する または 1:使用しない)。システムがRTC(カレンダ時計)をサポートしない場合は、1をセットします。この場合、FatFsが変更を加えたオブジェクトのタイムスタンプはデフォルトの日時を持ちます。RTCが使用可能なときは、0を設定し、<tt>get_fattime</tt>関数をプロジェクトに加えます。リード オンリ構成ではこのオプションは意味を持ちません。</p>
|
||||
|
||||
@@ -193,31 +202,6 @@ div.doc h4 {margin-top: 2em }
|
||||
<h4 id="sync_t">_SYNC_t</h4>
|
||||
<p>O/S定義の同期オブジェクトの型を設定します。例: <tt>HANDLE</tt>、<tt>ID</tt>、<tt>OS_EVENT*</tt>、<tt>SemaphoreHandle_t</tt>など。また、O/S機能のヘッダ ファイルを<tt>ff.c</tt>のスコープ内にインクルードする必要があります。<tt>_FS_REENTRANT</tt>が0のときは意味を持ちません。</p>
|
||||
|
||||
<h4 id="word_access">_WORD_ACCESS</h4>
|
||||
<p>ボリューム上のワード データへのアクセス方法を設定します。唯一のプラットフォーム依存オプションです。</p>
|
||||
<table class="lst1">
|
||||
<tr><th>値</th><th>解説</th></tr>
|
||||
<tr><td>0</td><td>Byte-by-byteアクセス。全てのプラットフォームでコンパチブル。</td></tr>
|
||||
<tr><td>1</td><td>ワード アクセス。コード サイズが少し減るが、次の条件を共に満たしていない限り選択できない。<br>
|
||||
・非アライン メモリ アクセスが常に全ての命令で使用可能。<br>
|
||||
・メモリ上のバイト順がリトル エンディアン。</td></tr>
|
||||
</table>
|
||||
<p>次にいくつかのプロセッサにおける許可された設定を示します。</p>
|
||||
<pre>
|
||||
ARM7TDMI 0 *2 ColdFire 0 *1 V850E 0 *2
|
||||
Cortex-M3 0 *3 Z80 0/1 V850ES 0/1
|
||||
Cortex-M0 0 *2 x86 0/1 TLCS-870 0/1
|
||||
AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1
|
||||
AVR32 0 *1 RL78 0 *2 R32C 0 *2
|
||||
PIC18 0/1 SH-2 0 *1 M16C 0/1
|
||||
PIC24 0 *2 H8S 0 *1 MSP430 0 *2
|
||||
PIC32 0 *1 H8/300H 0 *1 8051 0/1
|
||||
|
||||
*1:ビッグ エンディアン
|
||||
*2:非アライン メモリ アクセス不可
|
||||
*3:いくつかのコンパイラがmem_cpy関数にLDM/STM命令を生成する
|
||||
</pre>
|
||||
|
||||
</div>
|
||||
|
||||
<p class="foot"><a href="../00index_j.html">戻る</a></p>
|
||||
|
||||
@@ -80,6 +80,9 @@ DRESULT disk_ioctl (
|
||||
<tr><td>ATA_GET_REV</td><td>リビジョン コードを<tt class="arg">buff</tt>の示す16バイトのバッファに読み出します。(ATA/CFカード専用)</td></tr>
|
||||
<tr><td>ATA_GET_MODEL</td><td>モデル コードを<tt class="arg">buff</tt>の示す40バイトのバッファに読み出します。(ATA/CFカード専用)</td></tr>
|
||||
<tr><td>ATA_GET_SN</td><td>シリアル番号を<tt class="arg">buff</tt>の示す20バイトのバッファに読み出します。(ATA/CFカード専用)</td></tr>
|
||||
<tr><td>ISDIO_READ</td><td><tt class="arg">buff</tt>の示すコマンド構造体に従いiSDIOレジスタからデータを読み出します。(FlashAir専用)</td></tr>
|
||||
<tr><td>ISDIO_WRITE</td><td><tt class="arg">buff</tt>の示すコマンド構造体に従いiSDIOレジスタにデータを書き込みます。(FlashAir専用)</td></tr>
|
||||
<tr><td>ISDIO_MRITE</td><td><tt class="arg">buff</tt>の示すコマンド構造体に従いiSDIOレジスタの一部のビットを書き換えます。(FlashAir専用)</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
+3
-3
@@ -34,7 +34,7 @@ DRESULT disk_read (
|
||||
<dt>sector</dt>
|
||||
<dd>読み出しを開始するセクタ番号。32ビットLBAで指定されます。</dd>
|
||||
<dt>count</dt>
|
||||
<dd>読み出すセクタ数が1~128の範囲で指定されます。</dd>
|
||||
<dd>読み出すセクタ数(1以上の値)が指定されます。</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
@@ -45,11 +45,11 @@ DRESULT disk_read (
|
||||
<dt>RES_OK (0)</dt>
|
||||
<dd>正常終了。</dd>
|
||||
<dt>RES_ERROR</dt>
|
||||
<dd>読み込み中にエラーが発生し、その回復にも失敗した。</dd>
|
||||
<dd>回復不能なエラーにより、読み出し操作を完了できなかった。</dd>
|
||||
<dt>RES_PARERR</dt>
|
||||
<dd>パラメータが不正。</dd>
|
||||
<dt>RES_NOTRDY</dt>
|
||||
<dd>ストレージ デバイスが動作可能状態ではない(初期化されていない)。</dd>
|
||||
<dd>ストレージ デバイスが動作可能な状態ではない (初期化されていない)。</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
|
||||
+4
-4
@@ -30,11 +30,11 @@ DRESULT disk_write (
|
||||
<dt>pdrv</dt>
|
||||
<dd>対象のデバイスを識別する物理ドライブ番号(0-9)が指定されます。</dd>
|
||||
<dt>buff</dt>
|
||||
<dd>ストレージ デバイスに書き込むセクタ データが格納された<em>バイト配列</em>が指定されます。バイト数は、セクタ サイズ*<tt class="arg">count</tt>となります。</dd>
|
||||
<dd>ストレージ デバイスに書き込むセクタ データが格納された<em>バイト配列</em>が指定されます。データのバイト数は、セクタ サイズ*<tt class="arg">count</tt>となります。</dd>
|
||||
<dt>sector</dt>
|
||||
<dd>書き込みを開始するセクタ番号。32ビットLBAで指定されます。</dd>
|
||||
<dt>count</dt>
|
||||
<dd>書き込むセクタ数が1~128の範囲で指定されます。</dd>
|
||||
<dd>書き込むセクタ数(1以上の値)が指定されます。</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
@@ -45,13 +45,13 @@ DRESULT disk_write (
|
||||
<dt>RES_OK (0)</dt>
|
||||
<dd>正常終了。</dd>
|
||||
<dt>RES_ERROR</dt>
|
||||
<dd>書き込み中にエラーが発生し、その回復にも失敗した。</dd>
|
||||
<dd>回復不能なエラーにより、書き込み操作を完了できなかった。</dd>
|
||||
<dt>RES_WRPRT</dt>
|
||||
<dd>メディアが書き込み禁止状態。</dd>
|
||||
<dt>RES_PARERR</dt>
|
||||
<dd>パラメータが不正。</dd>
|
||||
<dt>RES_NOTRDY</dt>
|
||||
<dd>ストレージ デバイスが動作可能状態ではない(初期化されていない)。</dd>
|
||||
<dd>ストレージ デバイスが動作可能な状態ではない (初期化されていない)。</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html lang="ja">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta http-equiv="Content-Style-Type" content="text/css">
|
||||
<link rel="up" title="FatFs" href="../00index_j.html">
|
||||
<link rel="alternate" hreflang="ja" title="English" href="../en/expand.html">
|
||||
<link rel="stylesheet" href="../css_j.css" type="text/css" media="screen" title="ELM Default">
|
||||
<title>FatFs - f_expand</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="para func">
|
||||
<h2>f_expand</h2>
|
||||
<p>ファイルに連続したデータ領域を割り当てます。</p>
|
||||
|
||||
<pre>
|
||||
FRESULT f_expand (
|
||||
FIL* <span class="arg">fp</span>, <span class="c">/* [IN] ファイル オブジェクト構造体へのポインタ */</span>
|
||||
FSIZE_t <span class="arg">fsz</span>, <span class="c">/* [IN] 割り当てサイズ */</span>
|
||||
BYTE <span class="arg">opt</span> <span class="c">/* [IN] 動作オプション */</span>
|
||||
);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="para arg">
|
||||
<h4>Parameters</h4>
|
||||
<dl class="par">
|
||||
<dt>fp</dt>
|
||||
<dd>対象となるファイル オブジェクト構造体へのポインタを指定します。</dd>
|
||||
<dt>fsz</dt>
|
||||
<dd>ファイルに割り当てるバイト単位のサイズ。データ型<tt>FSIZE_t</tt>は、<tt>DWORD</tt>(32-bit)または<tt>QWORD</tt>(64-bit)のエリアスで、exFATサポートの有無により切り替わります。</dd>
|
||||
<dt>opt</dt>
|
||||
<dd>実際に割り当てを行うかどうか指定するフラグ。</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="para ret">
|
||||
<h4>Return Values</h4>
|
||||
<p>
|
||||
<a href="rc.html#ok">FR_OK</a>,
|
||||
<a href="rc.html#de">FR_DISK_ERR</a>,
|
||||
<a href="rc.html#ie">FR_INT_ERR</a>,
|
||||
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
|
||||
<a href="rc.html#dn">FR_DENIED</a>,
|
||||
<a href="rc.html#tm">FR_TIMEOUT</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p><tt class="arg">opt</tt>に1を指定すると、ファイルに連続したデータ領域を割り当てます。<tt>f_lseek</tt>によるサイズ拡張とは異なり、対象ファイルのサイズは0(つまりデータ領域未割り当て)でなければなりません。リード/ライト ポインタは、ファイルの先頭に留まります。この関数により割り当てられたファイルの内容は未定義なので、それに対して何の前提も持つべきではありません。この関数は、次の理由により<tt>FR_DENIED</tt>で失敗することがあります。</p>
|
||||
<ul>
|
||||
<li>ボリューム上に連続した空き領域が見つからなかった。</li>
|
||||
<li>対象ファイルのサイズが0ではなかった。</li>
|
||||
<li>ファイルが非書き込みモードで開かれている。</li>
|
||||
<li>指定されたファイル サイズが無効。(FATボリューム上で >= 4GiB)</li>
|
||||
</ul>
|
||||
<p><tt class="arg">opt</tt>に0を指定したときは、連続したデータ領域を探すのみで、その時点ではファイルへの割り当てを行わず、代わりにそれを検索開始ポイントとしてファイル システム オブジェクトにセットします。これにより、そのボリューム上で別の操作(FAT変更を伴う)が行われない限り、書き込まれるファイルは少なくともそのサイズまでは連続性が保証され、遅延無く書き込めることになります。</p>
|
||||
<p>時間的制約のあるファイル読み書き操作において、連続データ領域を割り当てられたファイルは有利となります。これは、分割されたファイルによりもたらされる無用なランダム アクセスが減ることにより、ファイル システムやストレージ デバイスの処理のオーバーヘッドが削減されるからです。特にexFATボリューム上の連続ファイルでは一切のFATアクセスが発生せず、効率的なシーケンシャル アクセスが行えます。</p>
|
||||
<p>連続ファイルに対して低レベルI/Oを使用したさらに効率的な直接アクセスも容易に行えますが、これは将来の互換性の点で推奨はされません。</p>
|
||||
</div>
|
||||
|
||||
<div class="para comp">
|
||||
<h4>対応情報</h4>
|
||||
<p><tt>_USE_EXPAND == 1</tt>で、かつ<tt>_FS_READONLY == 0</tt>のとき使用可能です。</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="para use">
|
||||
<h4>使用例</h4>
|
||||
<pre>
|
||||
<span class="c">/* 連続ファイルの作成 */</span>
|
||||
|
||||
<span class="c">/* 新しいファイルの作成 */</span>
|
||||
res = f_open(fp = malloc(sizeof (FIL)), "file.dat", FA_WRITE|FA_CREATE_ALWAYS);
|
||||
if (res) { <span class="c">/* ファイルが開かれたかチェック */</span>
|
||||
free(fp);
|
||||
...
|
||||
}
|
||||
|
||||
<span class="c">/* 100 MiB の連続領域を割り当てる */</span>
|
||||
res = f_expand(fp, 104857600, 1);
|
||||
if (res) { <span class="c">/* 割り当てられたかチェック */</span>
|
||||
free(fp);
|
||||
...
|
||||
}
|
||||
<span class="c">/* 連続ファイル作成成功 fp でアクセス可能 */</span>
|
||||
|
||||
</pre>
|
||||
<pre>
|
||||
<span class="c">/* ファイル システムを介さず直接アクセスする例 */</span>
|
||||
|
||||
<span class="c">/* ファイル データの物理的位置を取得 */</span>
|
||||
drv = fp->obj.fs->drv;
|
||||
sect = fp->obj.fs->database + fp->obj.fs->csize * (fp->obj.sclust - 2);
|
||||
|
||||
<span class="c">/* ファイル先頭から2048セクタを書き込み */</span>
|
||||
res = disk_write(drv, buffer, sect, 2048);
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="para ref">
|
||||
<h4>参照</h4>
|
||||
<p><tt><a href="open.html">f_open</a>, <a href="lseek.html">f_lseek</a>, <a href="sfile.html">FIL</a></tt></p>
|
||||
</div>
|
||||
|
||||
<p class="foot"><a href="../00index_j.html">戻る</a></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -34,6 +34,7 @@
|
||||
<tr><td>/..</td><td>無効</td><td>ルート ディレクトリ(その上は辿れない)</td></tr>
|
||||
</table>
|
||||
<p>また、<tt><a href="config.html#str_volume_id">_STR_VOLUME_ID</a></tt>オプションを有効にすることでドライブ番号の識別には数字のほか、<tt>"sd:file1.txt"</tt>や<tt>"ram:swapfile.dat"</tt>のように、任意の文字列を使用することも可能になります。</p>
|
||||
<p><em>【注意】現リビジョン(R0.12)では、exFATボリューム上においてダブル ドット<tt>".."</tt>はシングル ドット<tt>"."</tt>として機能し、親ディレクトリを辿ることはできません。</em></p>
|
||||
</div>
|
||||
|
||||
<div class="para doc" id="case">
|
||||
|
||||
+1
-1
@@ -113,7 +113,7 @@ FRESULT play_file (
|
||||
if (rc) return rc;
|
||||
|
||||
<span class="c">/* 全てのデータが転送されるかエラーが発生するまで続ける */</span>
|
||||
while (rc == FR_OK && !f_eof(&fil)) {
|
||||
while (rc == FR_OK && !f_eof(&fil)) {
|
||||
|
||||
<span class="c">/* ほかの処理... */</span>
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ FRESULT f_getcwd (
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p>カレント ドライブのカレント ディレクトリのフル パス文字列を取得します。<tt>_VOLUMES</tt>が2以上のときは、論理ドライブ番号の付加されたパス名となります。</p>
|
||||
<p><em>現リビジョン(R0.12)では、exFATボリューム上ではカレント ディレクトリを得ることが出来ません。常にルート ディレクトリを返します。</em></p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -78,7 +78,7 @@ FRESULT f_getfree (
|
||||
tot_sect = (fs->n_fatent - 2) * fs->csize;
|
||||
fre_sect = fre_clust * fs->csize;
|
||||
|
||||
<span class="c">/* ボリューム全体のサイズと空きのサイズを表示 (512バイト/セクタと仮定) */</span>
|
||||
<span class="c">/* ボリュームのサイズと空きサイズを表示 (512バイト/セクタと仮定) */</span>
|
||||
printf("%10lu KiB total drive space.\n%10lu KiB available.\n",
|
||||
tot_sect / 2, fre_sect / 2);
|
||||
</pre>
|
||||
|
||||
@@ -29,7 +29,7 @@ FRESULT f_getlabel (
|
||||
<dt>path</dt>
|
||||
<dd>対象となる論理ドライブの<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。ヌル文字列の場合は、デフォルト ドライブを指定したことになります。</dd>
|
||||
<dt>label</dt>
|
||||
<dd>ボリューム名を格納する配列へのポインタを指定します。少なくとも12要素のサイズが必要です。ボリューム名がない場合はヌル文字列が返されます。この情報が不要なときはヌル ポインタを指定してください。</dd>
|
||||
<dd>ボリューム名を格納する配列へのポインタを指定します。<tt>_LFN_UNICODE == 0</tt>では少なくとも24バイト、<tt>_LFN_UNICODE == 1</tt>では少なくとも12文字のサイズが必要です。ボリューム名がない場合はヌル文字列が返されます。この情報が不要なときはヌル ポインタを指定してください。</dd>
|
||||
<dt>vsn</dt>
|
||||
<dd>ボリューム シリアル番号を格納する<tt>DWORD</tt>型変数へのポインタを指定します。この情報が不要なときはヌル ポインタを指定してください。</dd>
|
||||
</dl>
|
||||
|
||||
+5
-5
@@ -16,8 +16,8 @@
|
||||
<p>ファイルのリード/ライト ポインタを移動します。また、高速シーク機能使用時にはCLMT(後述)の作成にも使用します。</p>
|
||||
<pre>
|
||||
FRESULT f_lseek (
|
||||
FIL* <span class="arg">fp</span>, <span class="c">/* [IN] ファイル オブジェクト構造体へのポインタ */</span>
|
||||
DWORD <span class="arg">ofs</span> <span class="c">/* [IN] 移動先オフセット */</span>
|
||||
FIL* <span class="arg">fp</span>, <span class="c">/* [IN] ファイル オブジェクト構造体へのポインタ */</span>
|
||||
FSIZE_t <span class="arg">ofs</span> <span class="c">/* [IN] 移動先オフセット */</span>
|
||||
);
|
||||
</pre>
|
||||
</div>
|
||||
@@ -28,7 +28,7 @@ FRESULT f_lseek (
|
||||
<dt>fp</dt>
|
||||
<dd>対象となるファイル オブジェクト構造体へのポインタを指定します。</dd>
|
||||
<dt>ofs</dt>
|
||||
<dd>移動先のオフセット(リード/ライト ポインタ)値。ファイル先頭からのオフセットをバイト単位で指定します。</dd>
|
||||
<dd>移動先のオフセット(リード/ライト ポインタ)値。ファイル先頭からのオフセットをバイト単位で指定します。データ型<tt>FSIZE_t</tt>は、<tt>DWORD</tt>(32-bit)または<tt>QWORD</tt>(64-bit)のエリアスで、exFATサポートの有無により切り替わります。</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
@@ -48,7 +48,7 @@ FRESULT f_lseek (
|
||||
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p>ファイルのリード/ライト ポインタ(次に読み出し・書き込みされるバイトのオフセット)を移動します。オフセットの原点はファイル先頭です。書き込みモードでファイル サイズより大きな値を指定すると、そこまでファイル サイズが拡張され、拡張された部分のデータは未定義となります。データを遅延無く高速に書き込みたいときは、予めこの関数で必要なサイズまでファイル サイズを拡張しておくと良いでしょう。<tt>f_lseek</tt>関数が正常終了したあとは、リード/ライト ポインタが正しく移動したかチェックするべきです。リード/ライト ポインタが指定より小さいときは、次の原因が考えられます。</p>
|
||||
<p>ファイルのリード/ライト ポインタ(次に読み出し・書き込みされるバイトのオフセット)を移動します。オフセットの原点はファイル先頭です。書き込みモードでファイル サイズより大きな値を指定すると、そこまでファイル サイズが拡張され、拡張された部分のデータは未定義となります。データを遅延無く高速に書き込みたいときは、予めこの関数で必要なサイズまでファイル サイズを拡張しておくと良いでしょう。ファイルに連続したデータ領域を割り当てる必要があるときは、<tt>f_expand</tt>関数を使用してください。<tt>f_lseek</tt>関数が正常終了したあとは、リード/ライト ポインタが正しく移動したかチェックするべきです。リード/ライト ポインタが指定より小さいときは、次の原因が考えられます。</p>
|
||||
<ul>
|
||||
<li>非書き込みモードまたは高速シーク モードのため、ファイル サイズでクリップされた。</li>
|
||||
<li>ファイル拡張中にディスクが満杯になった。</li>
|
||||
@@ -122,7 +122,7 @@ FRESULT f_lseek (
|
||||
|
||||
<div class="para ref">
|
||||
<h4>参照</h4>
|
||||
<p><tt><a href="open.html">f_open</a>, <a href="sfile.html">FIL</a></tt></p>
|
||||
<p><tt><a href="open.html">f_open</a>, <a href="truncate.html">f_truncate</a>, <a href="expand.html">f_expand</a>, <a href="sfile.html">FIL</a></tt></p>
|
||||
</div>
|
||||
|
||||
<p class="foot"><a href="../00index_j.html">戻る</a></p>
|
||||
|
||||
+3
-3
@@ -50,10 +50,10 @@ FRESULT f_mkfs (
|
||||
<div class="para desc">
|
||||
<h4>説明</h4>
|
||||
<p>物理ドライブ上にFATボリュームを作成(フォーマット)します。FDISK形式が指定された場合は、物理ドライブ全体を占める基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。SFD形式では、FATボリュームが物理ドライブの先頭セクタからベタで作成されます。</p>
|
||||
<p>マルチ パーテーション機能(<tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>)が有効で、かつフォーマット対象の論理ドライブが特定の区画(1~4)に結び付けられている場合は、その区画の中にFATボリュームが作成されます。<tt class="arg">sfd</tt>は無視され、その物理ドライブはこれに先立ち、<tt>f_fdisk</tt>関数または他のツールで適切に区画設定されている必要があります。</p>
|
||||
<p>マルチ パーテーション機能(<tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>)により、フォーマット対象の論理ドライブが特定の区画(1~4)に結び付けられている場合は、その区画の中にFATボリュームが作成されます。<tt class="arg">sfd</tt>は無視され、その物理ドライブはこれに先立ち、<tt>f_fdisk</tt>関数または他のツールで適切に区画設定されている必要があります。</p>
|
||||
<p>パーテーション形式には、FDISK形式とSFD形式の二通りあります。FDISK形式は、ハードディスク、MMC、SDC、CFC、U Diskなどで標準的に使用されます。FDISK形式では一台の物理ドライブ上に一つまたは複数の区画を作成することができます。区画管理情報はMBR(物理ドライブの先頭セクタ)に記録されます。SFD形式は単に何の分割も行わない形式で、ボリュームは物理ドライブの先頭セクタから開始します。SFD形式は、フロッピー ディスク、マイクロドライブ、光学ディスク、およびその他スーパー フロッピー メディアで標準的に使用されています。</p>
|
||||
<p>FATタイプ(FAT12/FAT16/FAT32)は、そのボリューム上の<em>クラスタ数によってのみ決定</em>される決まり[FAT仕様書より]になっていて、それ以外の要因はありません。したがって、どのFATタイプになるかはボリューム サイズとクラスタ サイズに依存します。クラスタ サイズは大きくするほど性能が上がります。</p>
|
||||
<p>クラスタ数がFATタイプの境界に近くなるときは、<tt>FR_MKFS_ABORTED</tt>で関数が失敗する可能性があります。</p>
|
||||
<p>FATタイプ(FAT12/FAT16/FAT32)は、そのボリューム上の<em>クラスタ数によってのみ決定</em>される決まり[FAT仕様書より]になっていて、それ以外の要因はありません。したがって、どのFATタイプになるかはボリューム サイズとクラスタ サイズに依存します。クラスタ サイズは大きくするほど性能が上がります。クラスタ数がFATタイプの境界に近くなるときは、<tt>FR_MKFS_ABORTED</tt>で関数が失敗する可能性があります。</p>
|
||||
<p><em>現リビジョン(R0.12)では、exFATボリュームの作成はサポートされません。</em></p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@
|
||||
FRESULT f_mount (
|
||||
FATFS* <span class="arg">fs</span>, <span class="c">/* [IN] ファイル システム オブジェクト */</span>
|
||||
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] 論理ドライブ番号 */</span>
|
||||
BYTE <span class="arg">opt</span> <span class="c">/* [IN] オプション */</span>
|
||||
BYTE <span class="arg">opt</span> <span class="c">/* [IN] 動作オプション */</span>
|
||||
);
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
+3
-3
@@ -37,11 +37,11 @@
|
||||
<dd>そのオブジェクトに対する操作の拒否。原因としては次のようなことが考えられます。
|
||||
<ul>
|
||||
<li>書き込み禁止属性(<tt>AM_RDO</tt>)を持つファイルを書き込みモードで開こうとした。</li>
|
||||
<li>書き込み禁止属性を持つファイルやディレクトリを削除しようとした。</li>
|
||||
<li>書き込み禁止属性を持つオブジェクトを削除しようとした。</li>
|
||||
<li>空でないディレクトリまたはカレント ディレクトリを削除しようとした。</li>
|
||||
<li><tt>FA_READ</tt>フラグを付けずに開いたファイルに対して読み出しを行った。</li>
|
||||
<li><tt>FA_WRITE</tt>フラグを付けずに開いたファイルに対して書き込みまたはそれに類する操作を行った。</li>
|
||||
<li>ボリュームまたはディレクトリ テーブルが満杯でファイルやディレクトリを作成できなかった。</li>
|
||||
<li><tt>FA_WRITE</tt>フラグを付けずに開いたファイルに対して変更を加えようとした。</li>
|
||||
<li>ボリュームまたは静的ディレクトリが満杯でオブジェクトの新規作成ができなかった。</li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dt id="ex">FR_EXIST</dt>
|
||||
|
||||
+33
-29
@@ -26,9 +26,9 @@ FRESULT f_readdir (
|
||||
<h4>引数</h4>
|
||||
<dl class="par">
|
||||
<dt>dp</dt>
|
||||
<dd><tt>f_opendir</tt>関数で作成された有効なディレクトリ オブジェクトへのポインタを指定します。</dd>
|
||||
<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,49 @@ 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;
|
||||
sprintf(&path[i = strlen(path)], "/%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;
|
||||
|
||||
+3
-8
@@ -16,20 +16,15 @@
|
||||
<p><tt>DIR</tt>構造体は、<tt>f_opendir/f_readdir/f_findfirst/f_findnext</tt>関数のワーク エリアとして使用されます。アプリケーションは、この構造体のメンバを書き換えてはなりません。</p>
|
||||
<pre>
|
||||
<span class="k">typedef</span> <span class="k">struct</span> {
|
||||
FATFS* fs; <span class="c">/* 親ファイル システム オブジェクトへのポインタ */</span>
|
||||
WORD id; <span class="c">/* 親ファイル システム オブジェクトのマウントID */</span>
|
||||
WORD index; <span class="c">/* 次に検索開始するディレクトリ インデックス番号 */</span>
|
||||
DWORD sclust; <span class="c">/* テーブル開始クラスタ (0:ルート) */</span>
|
||||
_FDID obj; <span class="c">/* オブジェクトID */</span>
|
||||
DOWRD dptr; <span class="c">/* 現在のread/writeオフセット */</span>
|
||||
DWORD clust; <span class="c">/* 現在のクラスタ番号 */</span>
|
||||
DWORD sect; <span class="c">/* 現在のセクタ番号 */</span>
|
||||
BYTE* dir; <span class="c">/* 現在のSFNエントリ(Win[]内)へのポインタ */</span>
|
||||
BYTE* fn; <span class="c">/* SFNバッファへのポインタ (in/out) {file[8],ext[3],status[1]} */</span>
|
||||
<span class="k">#if</span> _FS_LOCK
|
||||
UINT lockid; <span class="c">/* サブ ディレクトリ ロックID (0:ルート) */</span>
|
||||
<span class="k">#endif</span>
|
||||
<span class="k">#if</span> _USE_LFN
|
||||
DWORD blk_ofs; <span class="c">/* 現在のエントリブロックの先頭 (0xFFFFFFFF:無効) */</span>
|
||||
WCHAR* lfn; <span class="c">/* LFNバッファへのポインタ (in/out) */</span>
|
||||
WORD lfn_idx; <span class="c">/* LFNエントリの先頭インデックス (0xFFFF:無効) */</span>
|
||||
<span class="k">#endif</span>
|
||||
<span class="k">#if</span> _USE_FIND
|
||||
const TCHAR* pat; <span class="c">/* マッチング パターンへのポインタ */</span>
|
||||
|
||||
@@ -49,11 +49,12 @@ FRESULT f_setlabel (
|
||||
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p>文字列の先頭にドライブ番号を含む場合は、その論理ドライブに対して設定されます。含まない場合は、デフォルト ドライブに設定されます。ボリューム ラベルを削除するときは、ヌル文字列を指定します。ボリューム ラベルのフォーマットは、ファイル名(SFN)とほぼ同じですが、次の点が異なります。</p>
|
||||
<p>文字列の先頭にドライブ番号を含む場合は、その論理ドライブに対して設定されます。含まない場合は、デフォルト ドライブに設定されます。ボリューム ラベルを削除するときは、ヌル文字列を指定します。FATボリューム上では、ボリューム ラベルのフォーマットは、ファイル名とほぼ同じですが、次の点が異なります。</p>
|
||||
<ul>
|
||||
<li>OEMコード換算で11バイト以下。ボリューム ラベルにはLFN拡張は適用されません。</li>
|
||||
<li>任意の位置にスペースを置くことができる。ただし、FATボリュームではトレーリング スペースは除去される。</li>
|
||||
<li>ピリオドを含むことはできない。</li>
|
||||
<li>任意の位置にスペースを置くことができる。ただし、最後尾となるスペースは除去される。</li>
|
||||
<li>FATボリュームでは、OEMコード換算で11バイト以下。</li>
|
||||
<li>exFATボリュームでは、11文字以下で、大文字小文字は保持される。</li>
|
||||
</ul>
|
||||
<p>【補足】 標準システム(Windows)では<tt>\xE5</tt>で始まるボーリューム ラベル(CP932なら「薔薇」など)の扱いに問題があります。このため、この関数ではそのような名前は無効として処理しています。</p>
|
||||
</div>
|
||||
|
||||
+10
-2
@@ -17,17 +17,20 @@
|
||||
|
||||
<pre>
|
||||
<span class="k">typedef</span> <span class="k">struct</span> {
|
||||
BYTE fs_type; <span class="c">/* FATタイプ (0:無効, FS_FAT12, FS_FAT16 or FS_FAT32) */</span>
|
||||
BYTE fs_type; <span class="c">/* ファイル システム (0, FS_FAT12, FS_FAT16, FS_FAT32 or FS_EXFAT) */</span>
|
||||
BYTE drv; <span class="c">/* 物理ドライブ番号 */</span>
|
||||
BYTE csize; <span class="c">/* クラスタ当たりのセクタ数 (1,2,4,8,...,128) */</span>
|
||||
BYTE n_fats; <span class="c">/* FATの多重化数 (1,2) */</span>
|
||||
BYTE wflag; <span class="c">/* win[]ダーティ フラグ */</span>
|
||||
BYTE fsi_flag; <span class="c">/* FSINFOフラグ (b7:Disabled, b0:Dirty) */</span>
|
||||
WORD id; <span class="c">/* ファイル システム マウントID */</span>
|
||||
WORD n_rootdir; <span class="c">/* ルート ディレクトリのエントリ数 (FAT12/16) */</span>
|
||||
WORD csize; <span class="c">/* クラスタ当たりのセクタ数 */</span>
|
||||
<span class="k">#if</span> _MAX_SS != _MIN_SS
|
||||
WORD ssize; <span class="c">/* セクタ サイズ (512, 1024, 2048 or 4096) */</span>
|
||||
<span class="k">#endif</span>
|
||||
<span class="k">#if</span> _FS_EXFAT
|
||||
BYTE* dirbuf; <span class="c">/* ディレクトリ エントリ ブロック操作バッファへのポインタ */</span>
|
||||
<span class="k">#endif</span>
|
||||
<span class="k">#if</span> _FS_REENTRANT
|
||||
_SYNC_t sobj; <span class="c">/* 同期オブジェクトID */</span>
|
||||
<span class="k">#endif</span>
|
||||
@@ -37,6 +40,11 @@
|
||||
<span class="k">#endif</span>
|
||||
<span class="k">#if</span> _FS_RPATH
|
||||
DWORD cdir; <span class="c">/* カレント ディレクトリのクラスタ番号 (0:ルート) */</span>
|
||||
<span class="k">#if</span> _FS_EXFAT
|
||||
DWORD cdc_scl; <span class="c">/* カレント ディレクトリを含むディレクトリの開始クラスタ番号 (cdir == 0では無効) */</span>
|
||||
DWORD cdc_size; <span class="c">/* b31-b8:カレント ディレクトリを含むディレクトリのサイズ, b7-b0: チェーン ステータス */</span>
|
||||
DWORD cdc_ofs; <span class="c">/* カレント ディレクトリを含むディレクトリ内の位置 (cdir == 0では無効) */</span>
|
||||
<span class="k">#endif</span>
|
||||
<span class="k">#endif</span>
|
||||
DWORD n_fatent; <span class="c">/* FATエントリ数 (総クラスタ数 + 2) */</span>
|
||||
DWORD fsize; <span class="c">/* FAT 1個のセクタ数 */</span>
|
||||
|
||||
+3
-6
@@ -17,14 +17,11 @@
|
||||
|
||||
<pre>
|
||||
<span class="k">typedef</span> <span class="k">struct</span> {
|
||||
FATFS* fs; <span class="c">/* 親ファイル システム オブジェクトへのポインタ */</span>
|
||||
WORD id; <span class="c">/* 親ファイル システム オブジェクトのマウントID */</span>
|
||||
_FDID obj; <span class="c">/* オブジェクトID */</span>
|
||||
BYTE flag; <span class="c">/* ファイル ステータス フラグ */</span>
|
||||
BYTE err; <span class="c">/* エラー中断フラグ */</span>
|
||||
DWORD fptr; <span class="c">/* ファイル読み書きポインタ (ファイル先頭からのバイト オフセット) */</span>
|
||||
DWORD fsize; <span class="c">/* ファイル サイズ(バイト単位) */</span>
|
||||
DWORD sclust; <span class="c">/* ファイル開始クラスタ番号 (0:割り当て無し) */</span>
|
||||
DWORD clust; <span class="c">/* 現在のクラスタ (fptrが0のときは無効、fptrがクラスタ境界上のときは前のクラスタ) */</span>
|
||||
FSIZE_t fptr; <span class="c">/* ファイル読み書きポインタ (ファイル先頭からのバイト オフセット) */</span>
|
||||
DWORD clust; <span class="c">/* 現在のクラスタ (fptrがクラスタ境界上のときは前のクラスタ、fptrが0のときは無効) */</span>
|
||||
DWORD dsect; <span class="c">/* 現在のデータ セクタ */</span>
|
||||
<span class="k">#if</span> !_FS_READONLY
|
||||
DWORD dir_sect; <span class="c">/* このファイルのディレクトリ エントリのあるセクタ */</span>
|
||||
|
||||
+13
-14
@@ -16,14 +16,15 @@
|
||||
<p><tt>FILINFO</tt>構造体は、<tt>f_stat/f_readdir/f_findfirst/f_findnext</tt>関数で返されるオブジェクトに関する情報を保持します。</p>
|
||||
<pre>
|
||||
<span class="k">typedef</span> <span class="k">struct</span> {
|
||||
DWORD fsize; <span class="c">/* ファイル サイズ */</span>
|
||||
WORD fdate; <span class="c">/* 最後に更新された日付 */</span>
|
||||
WORD ftime; <span class="c">/* 最後に更新された時刻 */</span>
|
||||
BYTE fattrib; <span class="c">/* アトリビュート */</span>
|
||||
TCHAR fname[13]; <span class="c">/* 短いファイル名 (8.3フォーマット) */</span>
|
||||
<span class="k">#if</span> _USE_LFN
|
||||
TCHAR* lfname; <span class="c">/* 長いファイル名のバッファへのポインタ */</span>
|
||||
int lfsize; <span class="c">/* 長いファイル名のバッファのサイズ [文字数] */</span>
|
||||
FSIZE_t fsize; <span class="c">/* ファイル サイズ */</span>
|
||||
WORD fdate; <span class="c">/* 最後に更新された日付 */</span>
|
||||
WORD ftime; <span class="c">/* 最後に更新された時刻 */</span>
|
||||
BYTE fattrib; <span class="c">/* アトリビュート */</span>
|
||||
<span class="k">#if</span> _USE_LFN != 0
|
||||
TCHAR altname[13]; <span class="c">/* 代替ファイル名 */</span>
|
||||
TCHAR fname[_MAX_LFN + 1]; <span class="c">/* 主ファイル名 */</span>
|
||||
<span class="k">#else</span>
|
||||
TCHAR fname[13]; <span class="c">/* ファイル名 */</span>
|
||||
<span class="k">#endif</span>
|
||||
} FILINFO;
|
||||
</pre>
|
||||
@@ -32,7 +33,7 @@
|
||||
<h4>メンバ</h4>
|
||||
<dl>
|
||||
<dt>fsize</dt>
|
||||
<dd>ファイルのバイト単位のサイズが格納されます。ディレクトリの場合は常に0です。</dd>
|
||||
<dd>ファイルのバイト単位のサイズが格納されます。ディレクトリの場合は常に0です。データ型<tt>FSIZE_t</tt>は、<tt>DWORD</tt>(32-bit)または<tt>QWORD</tt>(64-bit)のエリアスで、exFATサポートの有無により切り替わります。</dd>
|
||||
<dt>fdate</dt>
|
||||
<dd>ファイルの変更された日付、またはディレクトリの作成された日付が格納されます。<br>
|
||||
<dl>
|
||||
@@ -58,11 +59,9 @@
|
||||
<dt>fattrib</dt>
|
||||
<dd>属性フラグが格納されます。フラグは<tt>AM_DIR, AM_RDO, AM_HID, AM_SYS, AM_ARC</tt>の組み合わせとなります。</dd>
|
||||
<dt>fname[]</dt>
|
||||
<dd>8.3形式の名前(SFN)が<tt>'\0'</tt>で終わる文字列として格納されます。非LFN構成のときは、常に大文字で返されます。LFN構成のときは、文字列に含まれるASCII英字が小文字になる場合があります。</dd>
|
||||
<dt>lfname</dt>
|
||||
<dd>長いファイル名(LFN)を格納するバッファへのポインタ。このメンバは、この構造体を使用する前にアプリケーションにより初期化されなければなりません。NULLが設定されるとLFNは返されません。非LFN構成のときはこのメンバは存在しません。</dd>
|
||||
<dt>lfsize</dt>
|
||||
<dd>長いファイル名を格納するバッファのサイズ(要素数)。このメンバは、この構造体を使用する前にアプリケーションにより初期化されなければなりません。非LFN構成のときはこのメンバは存在しません。</dd>
|
||||
<dd>オブジェクト名が<tt>'\0'</tt>で終わる文字列として格納されます。読み出すべき項目が無いときは、ヌル文字列が返され、この構造体が無効であることを示します。</dd>
|
||||
<dt>altname[]</dt>
|
||||
<dd>代替ファイル名があるときは、それが<tt>'\0'</tt>で終わる文字列として格納されます。非LFN構成のときは、このメンバはありません。</dd>
|
||||
</dl>
|
||||
|
||||
<p class="foot"><a href="../00index_j.html">戻る</a></p>
|
||||
|
||||
+2
-2
@@ -15,7 +15,7 @@
|
||||
<h2>f_size</h2>
|
||||
<p>ファイルのサイズを取得します。</p>
|
||||
<pre>
|
||||
DWORD f_size (
|
||||
FSIZE_t f_size (
|
||||
FIL* <span class="arg">fp</span> <span class="c">/* [IN] ファイル オブジェクト */</span>
|
||||
);
|
||||
</pre>
|
||||
@@ -41,7 +41,7 @@ DWORD f_size (
|
||||
<h4>解説</h4>
|
||||
<p>この関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
|
||||
<pre>
|
||||
<span class="k">#define</span> f_size(fp) ((fp)->fsize)
|
||||
<span class="k">#define</span> f_size(fp) ((fp)->obj.objsize)
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
+6
-10
@@ -55,7 +55,6 @@ FRESULT f_stat (
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p>指定されたファイルまたはサブ ディレクトリの存在を調べます。存在しない場合は、<tt>FR_NO_FILE</tt>が帰ります。存在する場合は<tt>FR_OK</tt>が帰り、ファイル情報構造体にそれ関する情報(サイズ、タイムスタンプ、属性および短いファイル名)がストアされます。</p>
|
||||
<p>LFN構成のときは、ファイル情報構造体を使う前に<tt>fno.lfname</tt>をヌルに設定しておく必要があります。</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -74,23 +73,20 @@ FRESULT f_stat (
|
||||
|
||||
printf("Test for 'file.txt'...\n");
|
||||
|
||||
<span class="k">#if</span> _USE_LFN
|
||||
fno.lfname = 0;
|
||||
<span class="k">#endif</span>
|
||||
fr = f_stat("file.txt", &fno);
|
||||
switch (fr) {
|
||||
|
||||
case FR_OK:
|
||||
printf("Size: %u\n", fno.fsize);
|
||||
printf("Size: %lu\n", fno.fsize);
|
||||
printf("Timestamp: %u/%02u/%02u, %02u:%02u\n",
|
||||
(fno.fdate >> 9) + 1980, fno.fdate >> 5 & 15, fno.fdate & 31,
|
||||
fno.ftime >> 11, fno.ftime >> 5 & 63);
|
||||
printf("Attributes: %c%c%c%c%c\n",
|
||||
(fno.fattrib & AM_DIR) ? 'D' : '-',
|
||||
(fno.fattrib & AM_RDO) ? 'R' : '-',
|
||||
(fno.fattrib & AM_HID) ? 'H' : '-',
|
||||
(fno.fattrib & AM_SYS) ? 'S' : '-',
|
||||
(fno.fattrib & AM_ARC) ? 'A' : '-');
|
||||
(fno.fattrib & AM_DIR) ? 'D' : '-',
|
||||
(fno.fattrib & AM_RDO) ? 'R' : '-',
|
||||
(fno.fattrib & AM_HID) ? 'H' : '-',
|
||||
(fno.fattrib & AM_SYS) ? 'S' : '-',
|
||||
(fno.fattrib & AM_ARC) ? 'A' : '-');
|
||||
break;
|
||||
|
||||
case FR_NO_FILE:
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
<h2>f_tell</h2>
|
||||
<p>現在のリード/ライト ポインタを取得します。</p>
|
||||
<pre>
|
||||
DWORD f_tell (
|
||||
FSIZE_t f_tell (
|
||||
FIL* <span class="arg">fp</span> <span class="c">/* [IN] ファイル オブジェクト */</span>
|
||||
);
|
||||
</pre>
|
||||
|
||||
Reference in New Issue
Block a user