FatFs update to R0.11a.

This commit is contained in:
Jared Boone
2016-04-19 09:51:31 -07:00
parent ec75c00da2
commit 94c81528c1
118 changed files with 6365 additions and 5548 deletions

View File

@@ -17,7 +17,6 @@
<li><a href="#memory">メモリ使用量</a></li>
<li><a href="#reduce">モジュール サイズの縮小</a></li>
<li><a href="#lfn">長いファイル名</a></li>
<li><a href="#jap">日本語ファイル名の大文字変換</a></li>
<li><a href="#unicode">Unicode入出力への対応</a></li>
<li><a href="#reentrant">リエントランシー</a></li>
<li><a href="#dup">多重ファイル アクセス</a></li>
@@ -27,13 +26,12 @@
<li><a href="#fs3">APIの拡張的使用例</a></li>
<li><a href="#license">FatFsのライセンスについて</a></li>
</ol>
<hr>
<div class="para" id="port">
<div class="para doc" id="port">
<h3>ポーティングの際に配慮すべきこと</h3>
<h4>移植の際の前提条件</h4>
<p>FatFsモジュールは移植性に関して次の点を前提としています。</p>
<h4>ポーティングの際の前提条件</h4>
<p>FatFsモジュールはポータビリティに関して次の点を前提としています。</p>
<ul>
<li>処理系はANSI C準拠であること。<br>
FatFsモジュールはANSI C(C89)準拠で記述されているので、普通のCコンパイラなら特に処理系依存になる点はありません。</li>
@@ -45,10 +43,10 @@ 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="430" alt="functional diagram"></p>
<p><img src="../img/funcs.png" width="680" height="420" alt="functional diagram"></p>
<h4>ユーザの作成する関数</h4>
<p>必要なのはFatFsモジュールの要求するディスク関数を用意することだけで、それ以外にすることはありません。既に動作しているディスク モジュールがあるなら、そのAPIをFatFsに合わせるかグルー関数を介してつなぐだけで済みますが、無い場合はほかから移植するか最初から書くかする必要があります。定義されている全ての関数が常に必要なわけではありません。例えば、リード オンリ構成では書き込み系関数は必要ありません。次の表に構成オプションと要求される関数の対応を示します。</p>
<p>ポーティング作業は、要求されるデバイス制御関数を用意することが全てで、それ以外にすることは何もありません。既に動作しているデバイス制御モジュールがあるなら、そのAPIをFatFsに合わせるかグルー関数を介してつなぐだけで済みますが、無い場合はほかから移植するか最初から書くかする必要があります。定義されている全ての関数が常に必要なわけではありません。例えば、リード オンリ構成では書き込み系関数は必要ありません。次の表に構成オプションと要求される関数の対応を示します。</p>
<table class="lst2">
<tr><th>必要な関数</th><th>必要となる条件</th><th>備考</th></tr>
<tr><td>disk_status<br>disk_initialize<br>disk_read</td><td>常時</td><td rowspan="5">ffsample.zip (サンプル)<br>その他web上に多数</td></tr>
@@ -56,66 +54,56 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
<tr><td>disk_ioctl (GET_SECTOR_COUNT)<br>disk_ioctl (GET_BLOCK_SIZE)</td><td>_USE_MKFS == 1</td></tr>
<tr><td>disk_ioctl (GET_SECTOR_SIZE)</td><td>_MAX_SS != _MIN_SS</td></tr>
<tr><td>disk_ioctl (CTRL_TRIM)</td><td>_USE_TRIM == 1</td></tr>
<tr><td>ff_convert<br>ff_wtoupper</td><td>_USE_LFN &gt;= 1</td><td>option/unicode.c</td></tr>
<tr><td>ff_convert<br>ff_wtoupper</td><td>_USE_LFN != 0</td><td>option/unicode.cをプロジェクトに<br>加えればよい</td></tr>
<tr><td>ff_cre_syncobj<br>ff_rel_grant<br>ff_req_grant<br>ff_del_syncobj</td><td>_FS_REENTRANT == 1</td><td rowspan="2">option/syscall.c (サンプル)</td></tr>
<tr><td>ff_mem_alloc<br>ff_mem_free</td><td>_USE_LFN == 3</td></tr>
</table>
</div>
<div class="para" id="limits">
<div class="para doc" id="limits">
<h3>限界値</h3>
<ul>
<li>FATタイプ: FAT12, FAT16, FAT32。</li>
<li>同時オープン ファイル数: 無制限。(利用可能メモリによる)</li>
<li>ボリューム数: 最大 10。</li>
<li>ファイル サイズ: FAT規格に依存。(最大 4G-1バイト)</li>
<li>ボリューム サイズ: FAT規格に依存。(最大 2Tバイト(512バイト/セクタ時))</li>
<li>クラスタ サイズ: FAT規格に依存。(最大 64Kバイト(512バイト/セクタ時))</li>
<li>セクタ サイズ: FAT規格に依存。(5124096バイト)</li>
<li>同時マウント ボリューム数: 最大 10。</li>
<li>ファイル サイズ: 最大 4G-1バイト</li>
<li>ボリューム サイズ: 最大 2Tバイト(512バイト/セクタ時)</li>
<li>クラスタ サイズ: 最大 64Kバイト(512バイト/セクタ時)</li>
<li>セクタ サイズ: 512, 1024, 2048, 4096バイト</li>
</ul>
</div>
<div class="para" id="memory">
<div class="para doc" id="memory">
<h3>メモリ使用量</h3>
<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>10675</td><td>7171</td><td>6617</td><td>13355</td><td>10940</td><td>11722</td><td>13262</td><td>8113</td><td>9048</td><td>6032</td><td>7952</td></tr>
<tr class="ral"> <td class="cal">text (Min, R/W)</td> <td>6727</td><td>4631</td><td>4331</td> <td>8569</td> <td>7262</td> <td>7720</td> <td>9088</td><td>5287</td><td>5800</td><td>3948</td><td>5183</td></tr>
<tr class="ral"> <td class="cal">text (Full, R/O)</td> <td>4731</td><td>3147</td><td>2889</td> <td>6235</td> <td>5170</td> <td>5497</td> <td>6482</td><td>3833</td><td>3972</td><td>2862</td><td>3719</td></tr>
<tr class="ral"> <td class="cal">text (Min, R/O)</td> <td>3559</td><td>2485</td><td>2295</td> <td>4575</td> <td>4064</td> <td>4240</td> <td>5019</td><td>2993</td><td>3104</td><td>2214</td><td>2889</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>
</table>
<pre>
FatFs R0.10a options:
_FS_READONLY 0 (R/W) or 1 (R/O)
_FS_MINIMIZE 0 (Full function) or 3 (Minimized function)
_USE_STRFUNC 0 (Disable string functions)
_USE_MKFS 0 (Disable f_mkfs function)
_USE_FORWARD 0 (Disable f_forward function)
_USE_FASTSEEK 0 (Disable fast seek feature)
_CODE_PAGE 932 (Japanese Shift_JIS)
_USE_LFN 0 (Disable LFN feature)
_MAX_SS 512 (Fixed sector size)
_FS_RPATH 0 (Disable relative path feature)
_FS_LABEL 0 (Disable volume label functions)
_VOLUMES V (Number of logical drives to be used)
_MULTI_PARTITION 0 (Single partition per drive)
_FS_REENTRANT 0 (Disable thread safe)
_FS_LOCK 0 (Disable file lock control)
FatFs R0.11 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)
</pre>
</div>
<div class="para" id="reduce">
<div class="para doc" id="reduce">
<h3>モジュール サイズの縮小</h3>
<p>次の表は構成オプションの設定値によりどの機能が削除されるかを示します。</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">_FS_LABEL</td><td colspan="2">_USE_MKFS</td><td colspan="2">_USE_FORWARD</td><td colspan="2">_MULTI_PARTITION</td></tr>
<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&nbsp;&nbsp;</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>
@@ -150,50 +138,46 @@ _FS_LOCK 0 (Disable file lock control)
</table>
</div>
<div class="para" id="lfn">
<div class="para doc" id="lfn">
<h3>長いファイル名</h3>
<p>FatFsモジュールは、長いファイル名(LFN)をサポートします。ファイルに付けられた2つの異なる名前(短いファル名と長いファイル名)は、<tt>f_readdir()</tt>を除くファイル操作関数において透過です。デフォルト構成では、LFN機能はOFFになっています。LFN機能を有効にするには、<tt>_USE_LFN</tt>を1,2または3に設定し、<tt>option/unicode.c</tt>をプロジェクトに追加します。LFN機能は、加えてある程度のワーク エリア(LFN操作バッファ)を必要とします。バッファ長は使用できるメモリに応じて<tt>_MAX_LFN</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>
<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 cfg on ARM7</caption>
<tr><th>コードページ</th><th>コードサイズ[bytes]</th></tr>
<tr><td>SBCS</td><td>+3721</td></tr>
<tr><td>932(Shift_JIS)</td><td>+62609</td></tr>
<tr><td>936(GBK)</td><td>+177797</td></tr>
<tr><td>949(Korean)</td><td>+139857</td></tr>
<tr><td>950(Big5)</td><td>+111497</td></tr>
<caption>LFN構成 at CM3</caption>
<tr><th><tt>_CODE_PAGE</tt></th><th>追加コード</th></tr>
<tr><td>SBCS</td><td>+2.8K</td></tr>
<tr><td>932(Shift_JIS)</td><td>+62.6k</td></tr>
<tr><td>936(GBK)</td><td>+177k</td></tr>
<tr><td>949(Korean)</td><td>+139k</td></tr>
<tr><td>950(Big5)</td><td>+111k</td></tr>
</table>
<p>LFN機能の上手な使い方は、それを使わないということです。実際、組み込み用途ではLFN機能がどうしても必要になるということはほとんど無いはずです。LFNを有効にすると、選択されたコード ページに応じてモジュール サイズが増大します。右の表に各コード ページにおけるLFNを有効にしたときのモジュール サイズの違いを示します。特に、CJK地域では数万の文字が使われていますが、不幸なことにそれは巨大なOEMUnicode相互変換テーブルを要求し、モジュール サイズは劇的に増大します。その結果、それらのコード ページにおいてLFNを有効にしたFatFsモジュールは、多くの8ビット マイコンにインプリメントすることができません。</p>
<p>LFN機能のハードルはそれだけではありません。マイクロソフト社はFATファイル システムについていくつかの特許を保有しています。いずれもLFN機能の実装に関するもので、その利用に対して$0.25/unitのライセンス料を要求しています。このため、商用製品でLFN機能を利用するときは、最終仕向地によってはライセンスが必要になります。最近のFAT32ドライバの多くはLFN機能を含んでいるため、それらの使用に当たってライセンスが必要になりますが、FatFsではLFN機能を構成オプションで任意にON/OFFできるため、無効にしてライセンス問題を回避することもできます。</p>
</div>
<div class="para" id="jap">
<h3>日本語ファイル名の大文字変換</h3>
<p>CP932(Shift_JIS)でかつ非LFN構成のときは、拡張文字の小文字(2バイト英字・キリル文字・ギリシャ文字)に対して大文字変換を行わず、小文字のままSFNエントリに記録・検索されます(日本語MSDOS仕様)。このため、非LFN構成で全角小文字を含むファイルを作成すると、NT系Windowsでそのファイルを開けなくなります。LFN構成では大文字変換を行います(NT系Windows仕様)。</p>
</div>
<div class="para" id="unicode">
<div class="para doc" id="unicode">
<h3>Unicode入出力への対応</h3>
<p>FatFs API上におけるファイル名等の文字列データの入出力は、デフォルトではANSI/OEMコードで行われますが、これをUnicode(UTF-16)に切り替えることもできます(<tt>_LFN_UNICODE</tt>オプションで設定)。つまり、これはFatFsがLFN機能に完全対応していることを意味します。Unicodeのファイル名に関する詳細は、<a href="filename.html">ファイル名</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" id="reentrant">
<div class="para doc" id="reentrant">
<h3>リエントランシー</h3>
<p>互いに異なるボリュームに対するファイル操作はリエントラントで、常に同時平行に動作できます。同じボリュームに対してはデフォルトではリエントラントではありませんが、<tt>_FS_REENTRANT</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モジュールのリエントランシーに関しては何の前提もありません。</p>
<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>_TIMEOUT</tt>で指定された期間を越えた場合、その関数は<tt>FR_TIMEOUT</tt>でアボートします。いくつかのRTOSではタイムアウト機能はサポートされないかも知れません。</p>
<p>ひとつの例外が<tt>f_mount, f_mkfs, f_fdisk</tt>関数にあります。これらのボリューム制御関数は同じボリューム(または関連する物理ドライブ)に対してリエントラントではありません。これらの関数を使用するときは、アプリケーション レベルで排他制御しなければなりません。</p>
<p>注: このセクションはFatFsモジュールそれ自体のリエントランシーについて説明しています。<tt>_FS_REENTRANT</tt>は、各ファイル システム オブジェクトの排他制御を行うのみで、下位のディスク関数への再入を防止するものではありません。たとえば、シングル ボリューム構成では<tt>disk_status</tt>関数のみ再入される可能性があり、マルチ ボリューム構成ではどのディスク関数も再入される可能性があります。このように、複数のタスクから同時にFatFs APIを使う条件では、ディスクI/Oモジュールはスレッド セーフである必要があります。</p>
</div>
<div class="para" id="dup">
<div class="para doc" id="dup">
<h3>多重ファイル アクセス</h3>
<p>FatFsモジュールではデフォルトでは多重アクセス制御機能をサポートしていません。ファイルに対する多重アクセスは、そのアクセス モードによって制限されます。一つのファイルに対する多重オープンは、それらが全てリード モードのときに限って許可されます。書き込みモードを含む多重オープン、また開かれているファイルに対するリネームや削除を行ってはなりません。さもないと、そのボリュームのFAT構造が破壊される可能性があります。</p>
<p><tt>_FS_LOCK</tt>に1以上の値(値は同時に管理できるファイル数)をセットすることで多重アクセス制御機能が有効になり、ファイル単位のアクセス制御を自動で行うこともできます。この場合、上記のルールを破ったオープン・リネーム・削除を試みると、その関数は<tt>FR_LOCKED</tt>で失敗します。また、<tt>_FS_LOCK</tt>を越える数のファイルやサブ ディレクトリを同時にオープンしようとすると、<tt>FR_TOO_MANY_OPEN_FILES</tt>で失敗します。</p>
<p><tt><a href="config.html#fs_lock">_FS_LOCK</a></tt>に1以上の値(値は同時に管理できるファイル数)をセットすることで多重アクセス制御機能が有効になり、ファイル単位のアクセス制御を自動で行うこともできます。この場合、上記のルールを破ったオープン・リネーム・削除を試みると、その関数は<tt>FR_LOCKED</tt>で失敗します。また、<tt>_FS_LOCK</tt>を越える数のファイルやサブ ディレクトリを同時にオープンしようとすると、<tt>FR_TOO_MANY_OPEN_FILES</tt>で失敗します。</p>
</div>
<div class="para" id="fs1">
<div class="para doc" id="fs1">
<h3>効率的なファイル アクセス</h3>
<p>小規模な組込システムでのファイルの読み書きにおける効率の良いアクセスのため、アプリケーション プログラマはFatFsモジュールの中でどのような処理が行われているか考慮すべきです。ストレージ上のデータは<tt>f_read()</tt>により次のシーケンスで転送されます。</p>
<p>小規模な組込システムでのファイルの読み書きにおける効率の良いアクセスのため、アプリケーション プログラマはFatFsモジュールの中でどのような処理が行われているか考慮すべきです。ストレージ上のデータは<tt>f_read</tt>関数により次のシーケンスで転送されます。</p>
<p>図1. セクタ ミスアラインド リード (ショート)<br>
<img src="../img/f1.png" width="490" height="110" alt="fig.1">
</p>
@@ -203,12 +187,12 @@ _FS_LOCK 0 (Disable file lock control)
<p>図3. セクタ アラインド リード<br>
<img src="../img/f3.png" width="490" height="119" alt="fig.3">
</p>
<p>ファイルI/Oバッファはセクタの一部のデータを読み書きするためのセクタ バッファを意味します。セクタ バッファは、それぞれのファイル オブジェクト内のプライベート セクタ バッファまたはファイル システム オブジェクト内の共有セクタ バッファのどちらかです。バッファ構成オプションの<tt>_FS_TINY</tt>は、データ転送にどちらを使うかを決定します。タイニー バッファ(1)が選択されるとデータ メモリの消費はそれぞれのファイル オブジェクトで<tt>_MAX_SS</tt>バイト減少されます。この場合、FatFsモジュールはファイル データの転送とFAT/ディレクトリ アクセスにファイル システム オブジェクト内のセクタ バッファだけを使用します。タイニー バッファの欠点は、セクタ バッファにキャッシュされたFATデータがファイル データの転送により失われ、クラスタ境界の毎にリロードされなければならないことです。でも、悪くない性能と少ないメモリ消費の視点から多くのアプリケーションに適するでしょう。</p>
<p>図1はセクタの一部のデータがファイルI/Oバッファを経由で転送されることを示します。図2に示される長いデータの転送では、転送データの中間の1セクタまたはそれ以上のセクタにまたがる転送データがアプリケーション バッファに直接転送されています。図3は転送データ全体がセクタ境界にアライメントされている場合を示しています。この場合、ファイルI/Oバッファは使用されません。直接転送においては最大の範囲のセクタが<tt>disk_read()</tt>で一度に読み込まれますが、クラスタ境界を越えるマルチ セクタ転送はそれが隣接であっても行われません。</p>
<p>ファイルI/Oバッファはセクタの一部のデータを読み書きするためのセクタ バッファを意味します。セクタ バッファは、それぞれのファイル オブジェクト内のプライベート セクタ バッファまたはファイル システム オブジェクト内の共有セクタ バッファのどちらかです。バッファ構成オプションの<tt><a href="config.html#fs_tiny">_FS_TINY</a></tt>は、データ転送にどちらを使うかを決定します。タイニー バッファ(1)が選択されるとデータ メモリの消費はそれぞれのファイル オブジェクトで<tt>_MAX_SS</tt>バイト減少されます。この場合、FatFsモジュールはファイル データの転送とFAT/ディレクトリ アクセスにファイル システム オブジェクト内のセクタ バッファだけを使用します。タイニー バッファの欠点は、セクタ バッファにキャッシュされたFATデータがファイル データの転送により失われ、クラスタ境界の毎にリロードされなければならないことです。でも、悪くない性能と少ないメモリ消費の視点から多くのアプリケーションに適するでしょう。</p>
<p>図1はセクタの一部のデータがファイルI/Oバッファを経由で転送されることを示します。図2に示される長いデータの転送では、転送データの中間の1セクタまたはそれ以上のセクタにまたがる転送データがアプリケーション バッファに直接転送されています。図3は転送データ全体がセクタ境界にアライメントされている場合を示しています。この場合、ファイルI/Oバッファは使用されません。直接転送においては最大の範囲のセクタが<tt>disk_read</tt>関数で一度に読み込まれますが、クラスタ境界を越えるマルチ セクタ転送はそれが隣接であっても行われません。</p>
<p>このように、セクタにアライメントしたファイルの読み書きへの配慮はバッファ経由のデータ転送を避け、読み書き性能は改善されるでしょう。その効果に加え、タイニー構成でキャッシュされたFATデータがファイル データの転送によりフラッシュされず、非タイニー構成と同じ性能を小さなメモリ フットプリントで達成できます。</p>
</div>
<div class="para" id="fs2">
<div class="para doc" id="fs2">
<h3>フラッシュ メモリの特性への配慮</h3>
<p>HDDなどのディスク メディアとは異なり、SDCやCFCなどのフラッシュ メモリ メディアの性能を引き出すには、その特性を意識した制御が必要になります。</p>
<h4>マルチ セクタ書き込み</h4>
@@ -216,12 +200,13 @@ _FS_LOCK 0 (Disable file lock control)
図6. マルチ/シングル セクタ ライトの比較<br>
<img src="../img/f6.png" width="630" height="148" alt="fig.6">
</div>
<p>フラッシュ メモリ メディアの書き込み速度はシングル セクタ書き込みの時に最も低いものになり、一回のトランザクションで転送されるセクタ数が大きくなるほど書き込み速度は向上します。この効果はバス速度が高速になるほど顕著で、10倍以上の差が現れることも珍しくありません。<a href="../img/rwtest2.png">テスト結果</a>は、マルチ セクタ書き込み(W:16K, 32 sectors)がシングル セクタ書き込み(W:100, 1 sector)よりどの程度速いかを明確に示しています。大容量メディアほどシングル セクタ書き込みが遅くなる点もまた重要です。書き込みトランザクションの回数はまた、メディアの寿命にも影響してきます。このため、アプリケーションはなるべく大きなブロック(クラスタ サイズまたは2の累乗セクタ境界にアライメントした)で読み書きを行う必要があります。もちろん、アプリケーションからメディアに至る全てのレイヤがマルチ セクタ転送に対応していないと意味がありません。残念ながら、既存のオープン ソースのドライバの多くはマルチ セクタ転送に未対応です。なお、FatFsモジュールおよびサンプル ドライバはマルチ セクタ転送に対応しています。</p>
<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>_USE_TRIM</tt>に1を設定します。これはフラッシュ メモリ メディアの内部動作に期待した制御なので、効果があるとは限りません。また、ファイル消去の時間が延びることも考慮に入れるべきです。</p>
<p>通常のファイル消去では、記録されたデータに対して何らかの制御が行われるわけではなく、単にFAT上に未使用クラスタとして記録されているだけです。このため、ファイルが消去されたあともそれらは有効なメモリ ブロックとしてフラッシュ メモリ上に残ります。そこで、ファイルを消去するとき、占有していたデータ セクタを明示的に消去(つまり未使用ブロックにする)することにより、メディア内の空きブロックを増やすことができます。これにより、次にそのブロックに書き込むときの消去動作が無くなり、書き込み性能が向上する可能性があります。また、ウェアレベリングに使えるブロックが増え、メディアの耐久性も向上するかも知れません。この機能を有効にするには、構成オプションの<tt><a href="config.html#use_trim">_USE_TRIM</a></tt>に1を設定します。これはフラッシュ メモリ メディアの内部動作に期待した制御なので、効果があるとは限りません。また、ファイル消去の時間が延びることも考慮に入れるべきです。</p>
</div>
<div class="para" id="critical">
<div class="para doc" id="critical">
<h3>クリチカル セクション</h3>
<p>ストレージ上のFAT構造を操作している途中で、停電、不正なメディアの取り外し、回復不能なデータ エラー等の障害が発生すると、処理が中途半端な状態で中断され、その結果としてFATボリュームの構造が破壊される可能性があります。次にFatFsモジュールにおけるクリチカル セクションと、その間の障害により起きうるエラーの状態を示します。</p>
<div class="lset">
@@ -233,18 +218,18 @@ _FS_LOCK 0 (Disable file lock control)
<img src="../img/f5.png" width="320" height="436" alt="fig.5">
</div>
<br class="clr">
<p>赤で示したセクションを実行中に障害が発生した場合、クロス リンクが発生して操作対象のファイル ディレクトリが失われる可能性があります。黄色で示したセクションを実行中に障害が発生した場合、つぎのうちいずれかまたは複数の結果が生じる可能性があります。</p>
<p>赤で示したセクションを実行中に中断が発生した場合、クロス リンクが発生して操作のファイルディレクトリが失われる可能性があります。黄色で示したセクションを実行中に中断が発生した場合、のうちいずれかまたは複数の結果が生じる可能性があります。</p>
<ul>
<li>書き換え中のファイルのデータが破壊される。</li>
<li>追記中のファイルがオープン前の状態に戻る。</li>
<li>新規作成されたファイルが消える。</li>
<li>新規または上書きで作成されたファイルの長さがゼロになって残る。</li>
<li>ロストチェーンの発生によりボリュームの利用効率が悪化する。</li>
<li>ファイルの一部を書き換え中: 書き換えが中途半端な状態となり、結果データが破壊される。</li>
<li>追記モードでデータ記録中: ファイルが記録開始の前の状態に戻る。</li>
<li>新規作成したファイルに記録中: そのファイルが消える。</li>
<li>新規または上書きで作成したファイルに記録中: ファイルの長さがゼロになって残る。</li>
<li>これらの障害の結果、ロスト クラスタが発生してボリュームの利用効率が悪化する。</li>
</ul>
<p>いずれも書き込み中や操作の対象でないファイルには影響はありません。これらのクリチカル セクションは、ファイルを書き込みモードで開いている時間を最小限にするか、<tt>f_sync()</tt>を適宜使用することで図5のようにリスクを最小化することができます。</p>
<p>いずれの場合も操作の対象でないファイルには影響はありません。これらのクリチカル セクションは、ファイルを書き込みモードで開いている時間を最小限にするか、<tt>f_sync</tt>関数を適宜使用することで図5のようにリスクを最小化することができます。</p>
</div>
<div class="para" id="fs3">
<div class="para doc" id="fs3">
<h3>APIの拡張的使用例</h3>
<p>FatFs APIの拡張的使用例です。有用なコードがあった場合は、随時追加していきます。。</p>
<ol>
@@ -256,25 +241,27 @@ _FS_LOCK 0 (Disable file lock control)
</ol>
</div>
<div class="para" id="license">
<div class="para doc" id="license">
<h3>FatFsのライセンスについて</h3>
<p>ソース ファイルのヘッダにライセンス条件が記述されているので、利用の際はそれに従うこと。英語を読めない方のために以下に日本語訳を示しておきます。</p>
<pre>/*----------------------------------------------------------------------------/
/ FatFs - FAT file system module R0.10b (C)ChaN, 2014
<p>ソース ファイルにライセンス条件が記述されているので、利用の際はそれに従うこと。原文は英語ですが、参考までに以下に日本語訳を示しておきます。</p>
<pre>
/*----------------------------------------------------------------------------/
/ FatFs - FAT file system module R0.11 (C)ChaN, 2015
/-----------------------------------------------------------------------------/
/ FatFsモジュールは、小規模な組み込みシステム向けの汎用FATファイルシステム
/ モジュールです。これはフリー ソフトウェアとして、教育・研究・開発のために
/ 以下のライセンス ポリシーの下で公開されています。
/ FatFsモジュールはフリーソフトウェアで、次に示す条件の下に公開されています。
/
/ Copyright (C) 2014, ChaN, all right reserved.
/ Copyright (C) 2015, ChaN, all right reserved.
/
/ * FatFsモジュールはフリー ソフトウェアであり、また<em>無保証です</em>
/ * 用途に制限はありません。<em>あなたの責任の下において</em>、個人的・非営利的な
/ ものから商用製品の開発に及ぶ目的に使用・改変・再配布することができます。
/ * ソース コードを再配布するときは、上記の著作権表示を保持しなければなりません。
/
/-----------------------------------------------------------------------------/</pre>
<p>要するにFatFsはタダで自由に使えるということです。ソース コードを再配布するときは、このブロックをそのまま保持しておくこと。このようにFatFsはBSDライクなライセンスとしていますが、一つ大きな違いがあります。特に組み込み用途での利用価値を高めるため、バイナリ形式(ソース コードを含まない形式全て)での再配布については、条件は設けていません。その場合は、FatFsおよびそのライセンス文書についてはドキュメントに明記してもしなくてもかまいません。これは、一条項BSDライセンスと等価ということです。もちろんGNU GPLプロジェクトとも共存可能です。何らかの変更を加えて再配布する際は、矛盾しない他のライセンス(GNU GPLや修正BSDライセンスなど)に変更することも可能です。</p>
/ 1. ソースコードで再配布するときは、その中に上記の著作権表示、この条文、および
/ 次の免責事項を保持すること
/
/ このソフトウェアは、著作権者らおよびコントリビューターらによって<em>現状のまま</em>
/ 提供されており、<em>いかなる保証もありません</em>
/ 著作権者もコントリビューターも、このソフトウェアの使用により発生するいかなる
/ 損害についても、<em>責任を負いません</em>
/----------------------------------------------------------------------------*/
</pre>
<p>このようにFatFsはBSDライクなライセンスとしていますが、一つ大きな違いがあります。FatFsは主に組み込み向けとして開発されたため、バイナリ形式(ソース コードを含まない形式全て)での再配布については、商用での使いやすさを考慮して配布時の条件を設けていません。つまり、バイナリ配布の場合は、FatFsおよびそのライセンス文書についてドキュメントに明記してもしなくてもかまいません。これは、一条項BSDライセンスと等価ということです。もちろん、GNU GPLなどほとんど全てのオープン ソース ライセンスの下のプロジェクトにおいて共存可能です。FatFsに何らかの修正や拡張を加えてソース コードで再配布する場合は、矛盾しない他のオープン ソース ライセンス(GNU GPLや修正BSDライセンスなど)に変更することも可能です。</p>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>

View File

@@ -36,7 +36,6 @@ FRESULT f_close (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
</p>

View File

@@ -0,0 +1,225 @@
<!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="en" title="English" href="../en/config.html">
<link rel="stylesheet" href="../css_j.css" type="text/css" media="screen" title="ELM Default">
<style type="text/css" media="screen" title="ELM Default">
div.doc h3 {margin-top: 4em }
div.doc h4 {margin-top: 2em }
</style>
<title>FatFs - 構成オプション</title>
</head>
<body>
<h1>構成オプション</h1>
<p>FatFsには多くの構成オプションがあり、それぞれのプロジェクトの要求に応じて柔軟に機能を構成することができます。構成オプションは、<tt>ffconf.h</tt>に記述されます。</p>
<div class="para doc" id="func">
<h3>基本機能の設定</h3>
<h4 id="fs_readonly">_FS_READONLY</h4>
<p>0:リード/ライト or 1:リード オンリ。リード オンリ構成では、<tt>f_write</tt><tt>f_sync</tt><tt>f_unlink</tt><tt>f_mkdir</tt><tt>f_chmod</tt><tt>f_rename</tt><tt>f_truncate</tt><tt>f_getfree</tt>の基本API関数およびオプションの書き込み系API関数が削除されます。</p>
<h4 id="fs_minimize">_FS_MINIMIZE</h4>
<p>基本API関数を段階的に削除します。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>全ての基本API関数が利用可能。</td></tr>
<tr><td>1</td><td><tt>f_stat</tt><tt>f_getfree</tt><tt>f_unlink</tt><tt>f_mkdir</tt><tt>f_chmod</tt><tt>f_utime</tt><tt>f_truncate</tt><tt>f_rename</tt>関数が削除される。</td></tr>
<tr><td>2</td><td>1に加え、<tt>f_opendir</tt><tt>f_readdir</tt><tt>f_closedir</tt>関数が削除される。</td></tr>
<tr><td>3</td><td>2に加え、<tt>f_lseek</tt>関数が削除される。</td></tr>
</table>
<h4 id="use_strfunc">_USE_STRFUNC</h4>
<p>文字列入出力API関数<tt>f_gets</tt>, <tt>f_putc</tt>, <tt>f_puts</tt> and <tt>f_printf</tt>の構成。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>文字列入出力API関数を使用しない。</td></tr>
<tr><td>1</td><td>文字列入出力API関数を使用する。データのLF-CRLF変換はしない。</td></tr>
<tr><td>2</td><td>文字列入出力API関数を使用する。データのLF-CRLF変換をする。</td></tr>
</table>
<h4 id="use_find">_USE_FIND</h4>
<p>フィルタ付きディレクトリ読み出し機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_findfirst</tt><tt>f_findnext</tt>関数が利用可能になります。</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>
<h4 id="use_label">_USE_LABEL</h4>
<p>ボリューム ラベル操作機能の構成(0:無効 または 1:有効)。有効にすると、<tt>f_getlabel</tt><tt>f_setlabel</tt>関数が利用可能になります。</p>
<h4 id="use_forward">_USE_FORWARD</h4>
<p>ストリーミング読み出し機能の構成(0:無効 または 1:有効)。これと<tt>_FS_TINY</tt>を有効にすると、<tt>f_forward</tt>関数が利用可能になります。</p>
</div>
<div class="para doc" id="name">
<h3>名前空間とロケールの設定</h3>
<h4 id="code_page">_CODE_PAGE</h4>
<p>パス名等の文字列データのコード ページを指定します。不適切な設定は、ファイル オープン エラーの原因になる可能性があります。拡張文字が全く使われない場合は、どれを選んでも同じです。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>1</td><td>ASCII (非LFN構成でのみ有効)</td></tr>
<tr><td>437</td><td>U.S.</td></tr>
<tr><td>720</td><td>Arabic</td></tr>
<tr><td>737</td><td>Greek</td></tr>
<tr><td>771</td><td>KBL</td></tr>
<tr><td>775</td><td>Baltic</td></tr>
<tr><td>850</td><td>Latin 1</td></tr>
<tr><td>852</td><td>Latin 2</td></tr>
<tr><td>855</td><td>Cyrillic</td></tr>
<tr><td>857</td><td>Turkish</td></tr>
<tr><td>860</td><td>Portuguese</td></tr>
<tr><td>861</td><td>Icelandic</td></tr>
<tr><td>862</td><td>Hebrew</td></tr>
<tr><td>863</td><td>Canadian French</td></tr>
<tr><td>864</td><td>Arabic</td></tr>
<tr><td>865</td><td>Nordic</td></tr>
<tr><td>866</td><td>Russian</td></tr>
<tr><td>869</td><td>Greek 2</td></tr>
<tr><td>932</td><td>日本語 (DBCS)</td></tr>
<tr><td>936</td><td>簡体字中国語 (DBCS)</td></tr>
<tr><td>949</td><td>韓国語 (DBCS)</td></tr>
<tr><td>950</td><td>繁体字中国語 (DBCS)</td></tr>
</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>
<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>
</table>
<h4 id="max_lfn">_MAX_LFN</h4>
<p>LFN操作バッファのサイズを文字単位で指定(12255)します。LFN機能が無効のときは意味を持ちません。</p>
<h4 id="lfn_unicode">_LFN_UNICODE</h4>
<p>ファイルAPI上におけるUnicode対応機能を設定します。非LFN構成のときは、0でなければなりません。LFN構成のときに1を選択すると、ファイルAPI上の文字列データ<tt>TCHAR</tt>型の定義が切り替わり、パス名等にUnicodeを使用するようになります。この機能は、文字列入出力関数にも影響します。詳しくは、<a href="filename.html#uni">こちら</a>を参照してください。</p>
<h4 id="strf_encode">_STRF_ENCODE</h4>
<p>Unicode API構成のとき、文字列入出力関数、<tt>f_gets</tt><tt>f_putc</tt><tt>f_puts</tt><tt>f_printf</tt>、におけるファイル上のエンコーディングを指定します。非Unicode API構成のときは意味を持ちません。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>ANSI/OEM</td></tr>
<tr><td>1</td><td>UTF-16LE</td></tr>
<tr><td>2</td><td>UTF-16BE</td></tr>
<tr><td>3</td><td>UTF-8</td></tr>
</table>
<h4 id="fs_rpath">_FS_RPATH</h4>
<p>相対パス機能を設定します。この機能は、ディレクトリ読み出し関数の出力にも影響します。詳しくは、<a href="filename.html#nam">こちら</a>を参照してください。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>相対パス機能を使わない。パス名は常にルート ディレクトリから辿る。</td></tr>
<tr><td>1</td><td>相対パス機能を使う。<tt>f_chdir</tt><tt>f_chdrive</tt>関数が利用可能になる。</td></tr>
<tr><td>2</td><td>1に加え、<tt>f_getcwd</tt>関数が利用可能になる。</td></tr>
</table>
</div>
<div class="para doc" id="volume">
<h3>ボリューム/物理ドライブの設定</h3>
<h4 id="volumes">_VOLUMES</h4>
<p>利用するボリューム(論理ドライブ)の数を19の範囲で設定します。</p>
<h4 id="str_volume_id">_STR_VOLUME_ID</h4>
<p>文字列ボリュームIDの設定(0:無効 または 1:有効)。パス名中のボリュームIDに数字に加え任意の文字列も使用できるようにするオプションです。ボリュームID文字列は<tt>_VOLUME_STRS</tt>で定義します。</p>
<h4 id="volume_strs">_VOLUME_STRS</h4>
<p>ボリュームID文字列を定義します。<tt>_VOLUMES</tt>で設定された個数の文字列を<tt>"RAM","SD","CF",...</tt> のように挙列します。使用可能な文字はAZおよび09で、先頭の項目が論理ドライブ0に対応します。</p>
<h4 id="multi_partition">_MULTI_PARTITION</h4>
<p>マルチ区画機能の設定(0:無効 または 1:有効)。無効のときは、個々の論理ドライブは同じ番号の物理ドライブに1:1で対応し、それぞれの物理ドライブ中の最初の区画に結びつけられます。マルチ区画機能を有効にすると、論理ドライブはそれぞれ任意の物理ドライブの任意の区画に結びつけることができます。マッピングは、ユーザ定義の変換テーブル<tt>VolToPart[]</tt>によって行います。また、<tt>f_fdisk</tt>関数が利用可能になります。詳しくは、<a href="filename.html#vol">こちら</a>を参照してください。</p>
<h4 id="max_ss">_MIN_SS、_MAX_SS</h4>
<p>使用する物理ドライブのセクタ サイズ(データの読み書きの最小単位)を設定します。有効な値は、512、1024、2048、4096です。<tt>_MIN_SS</tt>は最小サイズ、<tt>_MAX_SS</tt>は最大サイズを設定します。メモリ カードやハードディスクでは、常に両方に512を設定しますが、オンボード メモリや一部の光学メディアでは大きな値を設定する必要があるかも知れません。<tt>_MAX_SS &gt; _MIN_SS</tt>に設定したときは可変セクタ サイズ構成となり、<tt>disk_ioctl</tt>関数には<tt>GET_SECTOR_SIZE</tt>コマンドを実装する必要があります。</p>
<h4 id="use_trim">_USE_TRIM</h4>
<p>ATA-TRIM機能の使用の設定(0:無効 または 1:有効)。この機能を有効にしたときは、<tt>disk_ioctl</tt>関数に<tt>CTRL_TRIM</tt>コマンドを実装するべきです。</p>
<h4 id="fs_nofsinfo">_FS_NOFSINFO</h4>
<p>FAT32ボリュームのFSINFOの使用の設定(03)。FAT32ボリュームで必ず正確な空き容量を取得する必要があるとき、設定値のビット0をセットすると<tt>f_getfree</tt>関数はFSINFOの情報を使わずに全FATスキャンを行って空き容量を得ます。ビット1は最終割り当てクラスタ番号の利用の制御です。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>bit0=0</td><td>FSINFOの空きクラスタ情報が有効なときはそれを利用する。</td></tr>
<tr><td>bit0=1</td><td>FSINFOの空きクラスタ情報を利用しない。</td></tr>
<tr><td>bit1=0</td><td>FSINFOの最終割り当てクラスタ番号が有効なときはそれを利用する。</td></tr>
<tr><td>bit1=1</td><td>FSINFOの最終割り当てクラスタ番号を利用しない。</td></tr>
</table>
</div>
<div class="para doc" id="system">
<h3>システムの設定</h3>
<h4 id="fs_tiny">_FS_TINY</h4>
<p>ファイル データ転送バッファの構成(0:ノーマル または 1:タイニ)。タイニ構成では、ファイル オブジェクト<tt>FIL</tt>内のプライベート セクタ バッファが削除され、<tt>_MAX_SS</tt>バイト小さくなります。ファイル データの転送には、代わりにファイル システム オブジェクト<tt>FATFS</tt>内のボリューム共有セクタ バッファが使われます。</p>
<h4 id="fs_nortc">_FS_NORTC</h4>
<p>RTC機能の使用の設定(0:使用する または 1:使用しない)。システムがRTC(カレンダ時計)をサポートしない場合は、1をセットします。この場合、FatFsが変更を加えたオブジェクトのタイムスタンプはデフォルトの日時を持ちます。RTCが使用可能なときは、0を設定し、<tt>get_fattime</tt>関数をプロジェクトに加えます。リード オンリ構成ではこのオプションは意味を持ちません。</p>
<h4 id="nortc_time">_NORTC_MON、_NORTC_MDAY、_NORTC_YEAR</h4>
<p>デフォルト日時の設定。<tt>_FS_NORTC</tt>が1のとき、固定して与えられる日付を指定します。<tt>_FS_NORTC</tt>が0のとき、およびリード オンリ構成ではこれらのオプションは意味を持ちません。</p>
<h4 id="fs_lock">_FS_LOCK</h4>
<p>ファイル ロック機能の設定。このオプションは、開かれたオブジェクトに対する不正な操作の制御機能を設定します。リード オンリ構成では0に設定しなければなりません。なお、ファイル ロック機能はリエントランシーとは関係ありません。</p>
<table class="lst1">
<tr><th></th><th>解説</th></tr>
<tr><td>0</td><td>ファイル ロック機能を使わない。ボリュームの破損を防ぐため、アプリケーションは不正なファイル操作を避けなければならない。</td></tr>
<tr><td>&gt;0</td><td>ファイル ロック機能を使う。数値は同時にオープンできるファイルやサブ ディレクトリの数を設定します。</td></tr>
</table>
<h4 id="fs_reentrant">_FS_REENTRANT</h4>
<p>リエントランシーの設定(0:無効 または 1:有効)。このオプションは、FatFsモジュール自体のリエントランシー(スレッド セーフ)の設定をします。異なるボリュームに対するファイル アクセスはこのオプションに関係なく常にリエントラントで、<tt>f_mount</tt><tt>f_mkfs</tt><tt>f_fdisk</tt>などのボリューム操作関数はこのオプションに関係なく常にリエントラントではありません。同じボリュームに対するファイル アクセス(つまり、ファイル システム オブジェクトの排他使用)のみがこのオプションの制御下にあります。このオプションを有効にしたときは、同期関数である<tt>ff_req_grant</tt><tt>ff_rel_grant</tt><tt>ff_del_syncobj</tt><tt>ff_cre_syncobj</tt>をプロジェクトに追加する必要があります。サンプルが<tt>option/syscall.c</tt>にあります。</p>
<h4 id="fs_timeout">_FS_TIMEOUT</h4>
<p>タイムアウト時間の設定。待ち合わせ時間が長いときに<tt>FR_TIMEOUT</tt>でファイル関数をアボートする時間を設定します。<tt>_FS_REENTRANT</tt>が0のときは意味を持ちません。</p>
<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>
</body>
</html>

View File

@@ -32,13 +32,13 @@ DSTATUS disk_initialize (
<div class="para ret">
<h4>戻り値</h4>
<p>この関数は戻り値としてディスク ステータスを返します。ディスク ステータスの詳細に関しては<tt><a href="dstat.html">disk_status()</a></tt>を参照してください。</p>
<p>この関数は戻り値としてディスク ステータスを返します。ディスク ステータスの詳細に関しては<a href="dstat.html"><tt>disk_status</tt></a>関数を参照してください。</p>
</div>
<div class="para desc">
<h4>解説</h4>
<p>ストレージ デバイスを初期化し、データの読み書きなど全ての動作が可能な状態にします。関数が成功すると、戻り値の<tt>STA_NOINIT</tt>フラグがクリアされます。</p>
<p><em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。エラー等により再初期化が必要なときは、<tt>f_mount()</tt>を使用してください。</em>FatFsモジュールは、自動マウント動作により、必要に応じてこの関数を呼び出します。</p>
<p>この関数はFatFsの管理下にあり、自動マウント動作により必要に応じて呼び出されます。<em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。再初期化が必要なときは、<tt>f_mount</tt>関数を使用してください。</em></p>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>

View File

@@ -27,7 +27,7 @@ DRESULT disk_ioctl (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。</dd>
<dd>対象のデバイスを識別する物理ドライブ番号(0-9)が指定されます。</dd>
<dt>cmd</dt>
<dd>制御コマンド コードが指定されます。</dd>
<dt>buff</dt>
@@ -55,10 +55,10 @@ DRESULT disk_ioctl (
<table class="lst">
<caption>標準ioctlコマンド</caption>
<tr><th>コマンド</th><th>解説</th></tr>
<tr><td>CTRL_SYNC</td><td>デバイスのデータ書き込み処理を完了させます。ドライバがライト バック キャッシュなどを持っている場合は、書き込まれていないデータを即時書き込みます。メディア上への書き込みがそれぞれ<tt>disk_write()</tt>の中で完了する場合は、このコマンドに対してすることはありません。</td></tr>
<tr><td>GET_SECTOR_COUNT</td><td>総セクタ数の取得。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にドライブ上の総セクタ数を返します。<tt>f_mkfs()</tt>および<tt>f_fdisk()</tt>内から呼び出され、作成するボリュームのサイズを決定するために使用されます。</td></tr>
<tr><td>GET_SECTOR_SIZE</td><td>セクタ サイズの取得。<tt class="arg">buff</tt>の指す<tt>WORD</tt>型変数にドライブのセクタ サイズを返します。有効値は512、1024、2048または4096です。セクタ サイズ固定(<tt>_MAX_SS ==_MIN_SS</tt>)のときはこのコマンドは使われることはなく、デバイスは常にそのセクタ サイズで動作しなければなりません。</td></tr>
<tr><td>GET_BLOCK_SIZE</td><td>消去ブロック サイズの取得。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にフラッシュ メモリの消去ブロック サイズ(セクタ単位)を返します。1から32768の範囲で2の累乗の値でなければなりません。ブロック サイズ不明またはフラッシュ メモリ以外のデバイスでは1を返します。<tt>f_mkfs()</tt>内でのみ使用され、作成されるボリュームのデータ領域はこの境界にアライメントされます。</td></tr>
<tr><td>CTRL_SYNC</td><td>デバイスのデータ書き込み処理を完了させます。ドライバがライト バック キャッシュなどを持っている場合は、書き込まれていないデータを即時書き込みます。メディア上への書き込みがそれぞれ<tt>disk_write</tt>関数の中で完了する場合は、このコマンドに対してすることはありません。</td></tr>
<tr><td>GET_SECTOR_COUNT</td><td>総セクタ数の取得。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にドライブ上の総セクタ数を返します。<tt>f_mkfs, f_fdisk</tt>関数内から呼び出され、作成するボリュームのサイズを決定するために使用されます。</td></tr>
<tr><td>GET_SECTOR_SIZE</td><td>セクタ サイズの取得。セクタ サイズ可変(<tt>_MAX_SS &gt; _MIN_SS</tt>)のとき、<tt>disk_initailize</tt>関数の成功に続き呼び出されるので、<tt class="arg">buff</tt>の指す<tt>WORD</tt>型変数に現在のセクタ サイズを返します。有効値は512、1024、2048または4096です。セクタ サイズ固定(<tt>_MAX_SS == _MIN_SS</tt>)のときはこのコマンドは使われることはなく、デバイスは常にそのセクタ サイズで動作しなければなりません。</td></tr>
<tr><td>GET_BLOCK_SIZE</td><td>消去ブロック サイズの取得。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にフラッシュ メモリの消去ブロック サイズ(セクタ単位)を返します。1から32768の範囲で2の累乗の値でなければなりません。ブロック サイズ不明またはフラッシュ メモリ以外のデバイスでは1を返します。<tt>f_mkfs</tt>関数内でのみ使用され、作成されるボリュームのデータ領域はこの境界にアライメントされます。</td></tr>
<tr><td>CTRL_TRIM</td><td>不必要セクタの通知。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型配列には不必要になった領域 {開始セクタ,終了セクタ} を指定して呼び出されます。TRIM機能が有効(<tt>_USE_TRIM == 1</tt>)で、クラスタが解放されるとき、およびフォーマット時に呼び出されます。これは、ATAコマンド セットのTrimコマンドと等価で、この機能をサポートしないデバイスは何もする必要はありません。また、戻り値はチェックされず、結果によってFatFsの動作が影響を受けることはありません。</td></tr>
</table>
@@ -68,7 +68,7 @@ DRESULT disk_ioctl (
<tr><th>コマンド</th><th>解説</th></tr>
<tr><td>CTRL_FORMAT</td><td>メディアの物理フォーマットを行います。<tt class="arg">buff</tt>はNULLでないとき、進行表示のためのコールバック関数のアドレスを示します。</td></tr>
<tr><td>CTRL_POWER_IDLE</td><td>デバイスをアイドル状態にします。通常の読み書き要求でアクティブ状態に戻るなら、<tt>STA_NOINIT</tt>フラグをセットする必要はありません。</td></tr>
<tr><td>CTRL_POWER_OFF</td><td>デバイスをシャットダウン状態にします。<tt>STA_NOINIT</tt>はセットされます。デバイスは<tt>disk_initialize()</tt>でアクティブ状態に戻ります。</td></tr>
<tr><td>CTRL_POWER_OFF</td><td>デバイスをシャットダウン状態にします。<tt>STA_NOINIT</tt>はセットされます。デバイスは<tt>disk_initialize</tt>関数でアクティブ状態に戻ります。</td></tr>
<tr><td>CTRL_LOCK</td><td>ユーザによるメディアの取り出しを禁止します。</td></tr>
<tr><td>CTRL_UNLOCK</td><td>ユーザによるメディアの取り出しを許可します。</td></tr>
<tr><td>CTRL_EJECT</td><td>メディアを排出します。完了後、<tt>STA_NOINIT</tt><tt>STA_NODISK</tt>フラグはセットされます。</td></tr>

View File

@@ -28,13 +28,13 @@ DRESULT disk_read (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。シングル ドライブ システムでは、常に0が指定されます。</dd>
<dd>対象のデバイスを識別する物理ドライブ番号(0-9)が指定されます。シングル ドライブ システムでは、常に0が指定されます。</dd>
<dt>buff</dt>
<dd>ストレージ デバイスから読み出したデータを格納する<em>バイト配列</em>が指定されます。</dd>
<dt>sector</dt>
<dd>読み出しを開始するセクタ番号。32ビットLBAで指定されます。</dd>
<dt>count</dt>
<dd>読み出すセクタ数(1128)</dd>
<dd>読み出すセクタ数1128の範囲で指定されます</dd>
</dl>
</div>
@@ -49,19 +49,19 @@ DRESULT disk_read (
<dt>RES_PARERR</dt>
<dd>パラメータが不正。</dd>
<dt>RES_NOTRDY</dt>
<dd>ドライブが動作可能状態ではない(初期化されていない)。</dd>
<dd>ストレージ デバイスが動作可能状態ではない(初期化されていない)。</dd>
</dl>
</div>
<div class="para desc">
<h4>解説</h4>
<p>ストレージ デバイスに対するデータの読み書きは、セクタ単位で行われます。FatFsでは5124096バイトのセクタ サイズをサポートします。固定セクタ サイズ構成(<tt>_MIN_SS == MAX_SS</tt>)のときは、暗黙的にそのセクタ サイズで動作しなければなりません。可変セクタ サイズ構成(<tt>_MIN_SS &lt; MAX_SS</tt>)</p>のときは、初期化後<tt>disk_ioctl()</tt>でセクタ サイズを問い合わせてくるので、それに対して正しい値を返す必要があります。</t>
<p>ストレージ デバイスに対するデータの読み書きは、セクタ単位で行われます。FatFsでは5124096バイトのセクタ サイズをサポートします。固定セクタ サイズ構成(<tt>_MIN_SS == MAX_SS</tt>)のときは、暗黙的にそのセクタ サイズで動作しなければなりません。可変セクタ サイズ構成(<tt>_MIN_SS &lt; MAX_SS</tt>)のときは、<tt>disk_initialize</tt>関数に続いて<tt>disk_ioctl</tt>関数でセクタ サイズを問い合わせてくるので、それに対して正しい値を返す必要があります。</p>
<p><tt class="arg">buff</tt><tt>BYTE</tt>型なので、指定されるアドレスは<em>常にワード アライメントされているとは限りません</em>。非アライメント アドレスへの転送は、<a href="appnote.html#fs1">直接転送</a>において発生することがあります。もしも、ハードウェア上の制約でそのような転送が不可能なときは、この関数内で二段転送するなどして解決するか、または別の方法で対応しなければなりません。次にいくつかの対応方法を示します(いずれか一つでOK)。</p>
<ul>
<li>この関数内で解決する - 推奨</li>
<li><tt>f_read()</tt>において、セクタ全体を含む転送を避ける - 直接転送が発生しない</li>
<li><tt>f_read(fp, buff, btr, &amp;br)</tt>において、<tt>(((UINT)buff &amp; 3) == (f_tell(fp) &amp; 3))</tt>を満足させる - <tt class="arg">buff</tt>のワード アライメントが保証される</li>
<li>全ての<tt>f_read()</tt>において、セクタ全体を含む転送を避ける - 直接転送が発生しない</li>
<li><tt>f_read(fp, data, btr, &amp;br)</tt>において、<tt>(((UINT)data &amp; 3) == (f_tell(fp) &amp; 3))</tt>を満足させる - 直接転送での<tt class="arg">buff</tt>のワード アライメントが保証される</li>
</ul>
<p>一般的に、複数セクタの転送要求は、ストレージ デバイスに対して可能な限りマルチ セクタ転送しなければなりません。複数のシングル セクタ読み出しに分解された場合、スループットが低下することがあります。</p>
</div>

View File

@@ -35,7 +35,7 @@ DSTATUS disk_status (
<p>現在のストレージ デバイスの状態を次のフラグの組み合わせ値で返します。</p>
<dl class="ret">
<dt>STA_NOINIT</dt>
<dd>デバイスが初期化されていないことを示すフラグ。システム リセットやメディアの取り外し等でセットされ、<tt>disk_initialize()</tt>の正常終了でクリア、失敗でセットされます。メディア交換は非同期に発生するイベントなので、過去にメディア交換があった場合もこのフラグに反映させる必要があります。FatFsモジュールは、このフラグを参照してマウント動作が必要かどうかを判断します。</dd>
<dd>デバイスが初期化されていないことを示すフラグ。システム リセットやメディアの取り外し等でセットされ、<tt>disk_initialize</tt>関数の正常終了でクリア、失敗でセットされます。メディア交換は非同期に発生するイベントなので、過去にメディア交換があった場合もこのフラグに反映させる必要があります。FatFsモジュールは、このフラグを参照してマウント動作が必要かどうかを判断します。</dd>
<dt>STA_NODISK</dt>
<dd>メディアが存在しないことを示すフラグ。メディアが取り外されている間はセットされ、セットされている間はクリアされます。固定ディスクでは常にクリアします。なお、このフラグはFatFsモジュールでは参照されません。</dd>
<dt>STA_PROTECT</dt>

View File

@@ -28,13 +28,13 @@ DRESULT disk_write (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。</dd>
<dd>対象のデバイスを識別する物理ドライブ番号(0-9)が指定されます。</dd>
<dt>buff</dt>
<dd>ストレージ デバイスに書き込むセクタ データが格納された<em>バイト配列</em>が指定されます。バイト数は、セクタ サイズ*<tt class="arg">count</tt>となります。</dd>
<dt>sector</dt>
<dd>書き込みを開始するセクタ番号。32ビットLBAで指定されます。</dd>
<dt>count</dt>
<dd>書き込むセクタ数(1128)</dd>
<dd>書き込むセクタ数1128の範囲で指定されます</dd>
</dl>
</div>
@@ -51,16 +51,16 @@ DRESULT disk_write (
<dt>RES_PARERR</dt>
<dd>パラメータが不正。</dd>
<dt>RES_NOTRDY</dt>
<dd>デバイスが動作可能状態ではない(初期化されていない)。</dd>
<dd>ストレージ デバイスが動作可能状態ではない(初期化されていない)。</dd>
</dl>
</div>
<div class="para desc">
<h4>解説</h4>
<p><tt class="arg">buff</tt>に指定されるアドレスは<em>常にワード アライメントされているとは限りません</em>詳細は、<a href="dread.html"><tt>disk_read()</tt></a>の解説を参照してください。</p>
<p><tt class="arg">buff</tt>に指定されるアドレスは<em>常にワード アライメントされているとは限りません</em>これについては、<a href="dread.html"><tt>disk_read</tt></a>関数の解説を参照してください。</p>
<p>一般的に、複数セクタの転送要求は、デバイスに対して可能な限りマルチ セクタ転送しなければなりません。複数のシングル セクタ書き込みに分解された場合、スループットが著しく低下することがあります。</p>
<p>FatFsはディスク関数が遅延書き込み機能を持つことも想定しています。この関数から戻るとき、デバイスが書き込み中とかキャッシュに書き込まれただけなど、必ずしもメディアへの書き込みが完了している必要はありません。ただし、<tt class="arg">buff</tt>のデータは、この関数から戻ると無効となります。書き込み完了の要求は、<tt><a href="dioctl.html">disk_ioctl()</a></tt><tt>CTRL_SYNC</tt>コマンドによって行われます。このような遅延書き込み機能が実装された場合、スループットをさらに向上させることができます。</p>
<p>FatFsはディスク制御レイヤが遅延書き込み機能を持つことも想定しています。この関数から戻るとき、デバイスが書き込みを実行中だったり単にライトバック キャッシュに書き込まれただけなど、必ずしもメディアへの書き込みが完了している必要はありません。ただし、<tt class="arg">buff</tt>のデータは、この関数から戻ると無効となります。書き込み完了の要求は、<a href="dioctl.html"><tt>disk_ioctl</tt></a>関数<tt>CTRL_SYNC</tt>コマンドによって行われます。このような遅延書き込み機能が実装された場合、書き込みスループットを向上させることができます。</p>
<p><em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。</em></p>
</div>

View File

@@ -39,7 +39,7 @@ int f_eof (
<div class="para desc">
<h4>解説</h4>
<p>f_eof関数は、現リビジョンではマクロとして実装されています。</p>
<p>この関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_eof(fp) ((int)((fp)->fptr == (fp)->fsize))
</pre>

View File

@@ -39,7 +39,7 @@ int f_error (
<div class="para desc">
<h4>解説</h4>
<p>f_error関数は、現リビジョンではマクロとして実装されています。</p>
<p>この関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_error(fp) ((fp)->err)
</pre>

View File

@@ -48,7 +48,7 @@ DWORD get_fattime (void);
<div class="para comp">
<h4>対応情報</h4>
<p>リード オンリー構成(<tt>_FS_READONLY == 1</tt>)ではこの関数は必要とされません。</p>
<p>リード オンリー構成(<tt>_FS_READONLY == 1</tt>)または、非RTCサポート構成(<tt>_RTC_NOUSE == 1</tt>)ではこの関数は必要とされません。</p>
</div>

View File

@@ -11,16 +11,16 @@
<body>
<h1>パス名のフォーマット</h1>
<div class="para" id="nam">
<div class="para doc" id="nam">
<h3>ファイル ディレクトリ名</h3>
<p>FatFsモジュールでファイル、ディレクトリ、ドライブの指定方法はDOS/Windows APIとほぼ同じです。パス名のフォーマットは次の通りです。</p>
<p>FatFsモジュールでは、パス名によるファイル、ディレクトリ、ドライブの指定方法はDOS/Windows APIとほぼ同じです。パス名のフォーマットは次の通りです。</p>
<pre>"[論理ドライブ番号:][/]ディレクトリ名/ファイル名"</pre>
<p>FatFsモジュールは長いファイル名(LFN)および8.3形式ファイル名(SFN)に対応しています。LFNは、(<tt>_USE_LFN &gt; 0</tt>)のとき使用可能になります。ディレクトリ セパレータにはDOS/Windows APIと同じく<tt>'/'</tt><tt>'\'</tt>を使用します。連続したセパレータは無視され1個として扱われます。唯一の違いは、論理ドライブの指定だけです。論理ドライブ番号は、<tt>'0'</tt><tt>'9'</tt>の一文字の数字とコロンで指定し、省略した場合は<em>デフォルト ドライブ</em>(0またはカレント ドライブ)が選択されます。</p>
<p>FatFsモジュールは長いファイル名(LFN)および8.3形式ファイル名(SFN)に対応しています。LFNは、(<tt><a href="config.html#use_lfn">_USE_LFN</a> &gt; 0</tt>)のとき使用可能になります。ディレクトリ セパレータにはDOS/Windows APIと同じく<tt>'/'</tt><tt>'\'</tt>を使用します。連続したセパレータは無視され1個として扱われます。唯一の違いは、論理ドライブの指定だけです。論理ドライブ番号は、<tt>'0'</tt><tt>'9'</tt>の一文字の数字とコロンで指定し、省略した場合は<em>デフォルト ドライブ</em>(0またはカレント ドライブ)が選択されます。</p>
<p>ヌル文字や制御文字(<tt>'\0'</tt><tt>'\x1F'</tt>)は、パス名の終端として認識されます。パス名に先行あるいは中に含まれるスペースは、LFN構成では名前の一部として有効ですが、非LFN構成ではスペースはパス名の終端として認識されます。</p>
<p>標準構成(<tt>_FS_RPATH == 0</tt>)のときは、全てのオブジェクトがルート ディレクトリから辿る絶対パスで指定されます。OS指向なカレント ディレクトリという概念は無く、またドット ディレクトリ(&quot;.&quot;&quot;..&quot;)は使用できません。パス名先頭のセパレータは無視されます。デフォルト ドライブ番号は常に0になります。</p>
<p>相対パスを有効(<tt>_FS_RPATH == 1</tt>)にしたときは、先行するセパレータの有無によって検索開始ディレクトリが変わり、セパレータがある場合はルート ディレクトリから、無い場合は<a href="chdir.html"><tt>f_chdir()</tt></a>で設定されるカレント ディレクトリからになります。またパス名にドット ディレクトリが使用できます。デフォルト ドライブ番号は<a href="chdrive.html"><tt>f_chdrive()</tt></a>で設定された値となります。</p>
<p>標準構成(<tt><a href="config.html#fs_rpath">_FS_RPATH</a> == 0</tt>)のときは、全てのオブジェクトがルート ディレクトリから辿る絶対パスで指定されます。OS指向なカレント ディレクトリという概念は無く、またドット ディレクトリ(<tt>"."</tt><tt>".."</tt>)は使用できません。パス名先頭のセパレータは無視されます。デフォルト ドライブ番号は常に0になります。</p>
<p>相対パスを有効(<tt>_FS_RPATH &gt;= 1</tt>)にしたときは、先行するセパレータの有無によって検索開始ディレクトリが変わり、セパレータがある場合はルート ディレクトリから、無い場合は<a href="chdir.html"><tt>f_chdir</tt></a>関数で設定されるカレント ディレクトリからになります。またパス名にドット ディレクトリが使用できます。デフォルト ドライブ番号は<a href="chdrive.html"><tt>f_chdrive</tt></a>関数で設定された値となります。</p>
<table class="lst2">
<tr><td>パス名の例</td><td>_FS_RPATH == 0</td><td>_FS_RPATH == 1</td></tr>
<tr><td>パス名の例</td><td>_FS_RPATH == 0</td><td>_FS_RPATH &gt;= 1</td></tr>
<tr class="lst3"><td>file.txt</td><td>ドライブ0のルート ディレクトリ下のファイル</td><td>カレント ドライブのカレント ディレクトリ下のファイル</td></tr>
<tr><td>/file.txt</td><td>ドライブ0のルート ディレクトリ下のファイル</td><td>カレント ドライブのルート ディレクトリ下のファイル</td></tr>
<tr><td></td><td>ドライブ0のルート ディレクトリ</td><td>カレント ドライブのカレント ディレクトリ</td></tr>
@@ -33,13 +33,19 @@
<tr><td>dir1/..</td><td>無効</td><td>カレント ディレクトリ</td></tr>
<tr><td>/..</td><td>無効</td><td>ルート ディレクトリ(その上は辿れない)</td></tr>
</table>
<p>また、<tt>_STR_VOLUME_ID</tt>オプションを有効にすることでドライブ番号の識別には数字のほか、<tt>"sd:file1.txt"</tt><tt>"ram:swapfile.dat"</tt>のように、任意の文字列を使用することも可能になります。</p>
<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>
</div>
<p><br></p>
<div class="para" id="uni">
<div class="para doc" id="case">
<h3>使用可能な文字と大文字小文字の識別</h3>
<p>FATファイル システムでファイル名に使用可能な文字は、<tt>09 AZ ! # $ % &amp; ' ( ) - @ ^ _ ` { } ~</tt>および拡張文字(<tt>\x80</tt><tt>\xFF</tt>)となっています。LFN拡張ではこれらに加え、<tt>+ , ; = [ ]</tt>およびスペースが使用可能になり、スペースとピリオドはファイル名の末尾を除く任意の位置に挿入できます。</p>
<p>FATファイル システムでは、パス名についてケース インセンシティブです。たとえば、<tt>file.txt, File.Txt, FILE.TXT</tt>の3つの名前は同じ物として扱われます。これは、ASCII文字だけでなく拡張文字についても適用されます。ファイルが作成される際、SFNエントリには全て大文字に変換された名前が記録されます。LFN対応システムでは、LFNエントリには大文字変換されない名前が記録されます。</p>
<p>古い日本語MS-DOSでは拡張文字(いわゆる全角文字)についてはケース センシティブでした。FatFsモジュールではこれにしたがい、非LFN構成で文字コードにDBCSが選択されたときに限り、拡張文字に対して大文字変換を行わずにSFNエントリに記録および検索されます(日本語MSDOS仕様)。LFN構成では拡張文字についても大文字変換を行います(WindowsNT仕様)。このため、非LFN構成で全角小文字を含む名前でファイルを作成すると、Windowsでそのファイルを開けなくなるなどの互換性問題を起こすので、それらのシステムで相互利用するボリューム上ではDBCS拡張文字の使用は避けるべきです。</p>
</div>
<div class="para doc" id="uni">
<h3>Unicode API</h3>
<p>ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、<tt>TCHAR</tt>で定義されていますが、これは通常は<tt>char</tt>のエリアスになっています。そして、<tt>_CODE_PAGE</tt>で指定されるANSI/OEMコード(SBCSまたはDBCS)の文字列として扱われます。ファイル名入出力をUnicodeとする構成(<tt>_LFN_UNICODE == 1</tt>)にしたときは、<tt>TCHAR</tt>はワイド文字(<tt>WCHAR, unsigned short</tt>)に切り替わり、パス名の入出力にUnicodeを使用するようになります。これによりLFN規格に完全対応となり、ANSI/OEMコードにない文字(たとえば ✝☪✡☸☭など)も使用できます。この設定は文字列入出力関数データ型とファイル上のエンコーディングに影響を与えます。リテラル文字列を定義するとき、次に示すように<tt>_T(s)</tt>および<tt>_TEXT(s)</tt>マクロを使ってANSI/OEMとUnicodeを自動切り替えすることができます。</p>
<p>ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、<tt>TCHAR</tt>で定義されていますが、これは通常は<tt>char</tt>のエリアスになっています。そして、<tt><a href="config.html#code_page">_CODE_PAGE</a></tt>で指定されるANSI/OEMコード(SBCSまたはDBCS)の文字列として扱われます。ファイル名入出力をUnicodeとする構成(<tt><a href="config.html#lfn_unicode">_LFN_UNICODE</a> == 1</tt>)にしたときは、<tt>TCHAR</tt>はワイド文字(<tt>WCHAR, unsigned short</tt>)に切り替わり、パス名の入出力にUnicodeを使用するようになります。これによりLFN規格に完全対応となり、ファイル名としてANSI/OEMコードにない文字(たとえば ✝☪✡☸☭など)も使用できます。この設定は文字列入出力関数においては、データ型とファイル上のエンコーディングに影響を与えます。リテラル文字列を定義するとき、次に示すように<tt>_T(s)</tt>および<tt>_TEXT(s)</tt>マクロを使ってANSI/OEMとUnicodeを自動切り替えすることができます。</p>
<pre>
f_open(fp, "filename.txt", FA_READ); <span class="c">/* ANSI/OEM専用コード */</span>
f_open(fp, L"filename.txt", FA_READ); <span class="c">/* Unicode専用コード */</span>
@@ -47,11 +53,10 @@
</pre>
</div>
<p><br></p>
<div class="para" id="vol">
<div class="para doc" id="vol">
<h3>ボリューム管理</h3>
<p>デフォルトの構成では、それぞれの論理ドライブは同じ番号の物理ドライブに1:1で結びつけられていて、自動検出機能によりその物理ドライブ上の一つのFATボリュームがマウントされます。FATボリュームの検出は、セクタ0、第一区画第四区画の順に行われます。</p>
<p><tt>_MULTI_PARTITION</tt>に1を指定すると、それぞれの論理ドライブに対して個別に物理ドライブ番号と区画を指定できるようになります。この構成では、論理ドライブと区画の対応を解決するためのテーブルを次に示すように定義する必要があります。</p>
<p><tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>に1を指定すると、それぞれの論理ドライブに対して個別に物理ドライブ番号と区画を指定できるようになります。この構成では、論理ドライブと区画の対応を解決するためのテーブルを次に示すように定義する必要があります。</p>
<pre>
例:論理ドライブ02を物理ドライブ0(非リムーバブル)の3つの基本区画に割り当て、
論理ドライブ3を物理ドライブ1(リムーバブル)に割り当てる場合。
@@ -72,5 +77,6 @@ PARTITION VolToPart[] = {
</ul>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
</body>
</html>

View File

@@ -0,0 +1,119 @@
<!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="en" title="English" href="../en/findfirst.html">
<link rel="stylesheet" href="../css_j.css" type="text/css" media="screen" title="ELM Default">
<title>FatFs - f_findfirst</title>
</head>
<body>
<div class="para func">
<h2>f_findfirst</h2>
<p>ディレクトリ内のオブジェクトの検索を開始します。</p>
<pre>
FRESULT f_findfirst (
DIR* <span class="arg">dp</span>, <span class="c">/* [OUT] ディレクトリ オブジェクト構造体へのポインタ */</span>
FILINFO* <span class="arg">fno</span>, <span class="c">/* [OUT] ファイル情報構造体へのポインタ */</span>
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] ディレクトリ名へのポインタ */</span>
const TCHAR* <span class="arg">pattern</span> <span class="c">/* [IN] マッチ パターン文字列へのポインタ */</span>
);
</pre>
</div>
<div class="para arg">
<h4>引数</h4>
<dl class="par">
<dt>dp</dt>
<dd>空のディレクトリ オブジェクト構造体へのポインタを指定します。</dd>
<dt>fno</dt>
<dd>最初にマッチしたディレクトリ項目を格納するファイル情報構造体へのポインタを指定します。</dd>
<dt>path</dt>
<dd>オープンするディレクトリの<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。</dd>
<dt>pattern</dt>
<dd>検索する名前を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。この文字列は、続く<tt>f_findnext</tt>関数でも参照されるため、一連の処理が終了するまで有効でなければなりません。</dd>
</dl>
</div>
<div class="para ret">
<h4>戻り値</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#nr">FR_NOT_READY</a>,
<a href="rc.html#np">FR_NO_PATH</a>,
<a href="rc.html#in">FR_INVALID_NAME</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#id">FR_INVALID_DRIVE</a>,
<a href="rc.html#ne">FR_NOT_ENABLED</a>,
<a href="rc.html#ns">FR_NO_FILESYSTEM</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>,
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>,
<a href="rc.html#tf">FR_TOO_MANY_OPEN_FILES</a>
</p>
</div>
<div class="para desc">
<h4>解説</h4>
<p><tt class="arg">path</tt>で指定されるディレクトリを開き、そのディレクトリ内の項目の検索を開始します。正常終了すると、ディレクトリ オブジェクト構造体が作成され、最初に検索名文字列に名前がマッチした項目の情報が<tt class="arg">fno</tt>の指定するファイル情報構造体にストアされます。名前のマッチする項目が見つからなかった場合は、<tt>fno-&gt;fname[]</tt>にヌル文字列が返されます。ファイル情報構造体の使い方については、<a href="readdir.html"><tt>f_readdir</tt></a>関数を参照してください。</p>
<p>マッチ パターン文字列は、ワイルドカード文字(<tt>?</tt><tt>*</tt>)を含むことができます。<tt>?</tt>は任意の1文字に、<tt>*</tt>は0文字以上の任意の文字列にマッチします。LFN構成では、SFNとLFN(あれば)の両方に対してテストを行います。現リビジョンではパターン マッチングにおいて次の点で標準システムとは異なる動作となります。</p>
<ul>
<li><tt>"*.*"</tt>は拡張子なしの名前にマッチしない。(標準システムでは全ての名前にマッチ)</li>
<li>ピリオドで終わるパターンは、どの名前にもマッチしない。(標準システムでは拡張子無しの名前にマッチ)</li>
<li><a href="filename.html#case">DBCS拡張文字</a>については、LFN構成でも非Unicode API構成ではケース センシティブとなる。</li>
</ul>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p>この関数は、<a href="opendir.html"><tt>f_opendir</tt></a>関数および<a href="readdir.html"><tt>f_readdir</tt></a>関数のラッパー関数です。<tt>_USE_FIND == 1</tt>で、かつ<tt>_FS_MINIMIZE &lt;= 1</tt>のとき使用可能になります。</p>
</div>
<div class="para use">
<h4>使用例</h4>
<pre>
<span class="c">/* ディレクトリ内のオブジェクトの検索と表示 */</span>
void find_image (void)
{
FRESULT fr; <span class="c">/* 戻り値 */</span>
DIR dj; <span class="c">/* ディレクトリ オブジェクト */</span>
FILINFO fno; <span class="c">/* ファイル情報構造体 */</span>
<span class="k">#if</span> _USE_LFN
char lfn[_MAX_LFN + 1];
fno.lfname = lfn;
fno.lfsize = _MAX_LFN + 1;
<span class="k">#endif</span>
fr = f_findfirst(&amp;dj, &amp;fno, "", "dsc*.jpg"); <span class="c">/* "dsc"で始まるJPEGファイルを検索 */</span>
while (fr == FR_OK &amp;&amp; fno.fname[0]) { <span class="c">/* 見つかる間繰り返し */</span>
<span class="k">#if</span> _USE_LFN
printf("%s %s\n", fno.fname, fno.lfname);<span class="c">/* 見つけた項目の名前を表示 */</span>
<span class="k">#else</span>
printf("%s\n", fno.fname);
<span class="k">#endif</span>
fr = f_findnext(&amp;dj, &amp;fno); <span class="c">/* 次を検索 */</span>
}
f_closedir(&amp;dj);
}
</pre>
</div>
<div class="para ref">
<h4>参照</h4>
<p><tt><a href="findnext.html">f_findnext</a>, <a href="closedir.html">f_closedir</a>, <a href="sdir.html">DIR</a>, <a href="sfileinfo.html">FILINFO</a></tt></p>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
</body>
</html>

View File

@@ -0,0 +1,68 @@
<!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="en" title="English" href="../en/findnext.html">
<link rel="stylesheet" href="../css_j.css" type="text/css" media="screen" title="ELM Default">
<title>FatFs - f_findnext</title>
</head>
<body>
<div class="para func">
<h2>f_findnext</h2>
<p>次にマッチするオブジェクトを検索します。</p>
<pre>
FRESULT f_findnext (
DIR* <span class="arg">dp</span>, <span class="c">/* [IN] ディレクトリ構造体へのポインタ */</span>
FILINFO* <span class="arg">fno</span> <span class="c">/* [OUT] ファイル情報構造体へのポインタ */</span>
);
</pre>
</div>
<div class="para arg">
<h4>引数</h4>
<dl class="par">
<dt>dp</dt>
<dd><tt>f_findfirst</tt>関数で作成された有効なディレクトリ構造体へのポインタを指定します。</dd>
<dt>fno</dt>
<dd>マッチしたディレクトリ項目を格納するファイル情報構造体へのポインタを指定します。</dd>
</dl>
</div>
<div class="para ret">
<h4>戻り値</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#tm">FR_TIMEOUT</a>,
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>
</p>
</div>
<div class="para desc">
<h4>解説</h4>
<p>次に名前のマッチするディレクトリ項目を検索し、見つかった項目をファイル情報構造体にストアします。名前のマッチする項目が見つからずディレクトリの最後まで達した場合は、<tt>fno-&gt;fname[]</tt>にヌル文字列が返されます。</p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p>この関数は、<a href="readdir.html"><tt>f_readdir</tt></a>関数のラッパー関数です。<tt>_USE_FIND == 1</tt>で、かつ<tt>_FS_MINIMIZE &lt;= 1</tt>のとき使用可能になります。</p>
</div>
<div class="para ref">
<h4>参照</h4>
<p><tt><a href="findfirst.html">f_findfirst</a>, <a href="closedir.html">f_closedir</a>, <a href="sdir.html">DIR</a>, <a href="sfileinfo.html">FILINFO</a></tt></p>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
</body>
</html>

View File

@@ -45,7 +45,6 @@ FRESULT f_forward (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
@@ -114,7 +113,7 @@ FRESULT play_file (
if (rc) return rc;
<span class="c">/* 全てのデータが転送されるかエラーが発生するまで続ける */</span>
while (rc == FR_OK &amp;&amp; fil.fptr &lt; fil.fsize) {
while (rc == FR_OK &amp;&amp; !f_eof(&fil)) {
<span class="c">/* ほかの処理... */</span>

View File

@@ -53,7 +53,7 @@ FRESULT f_getfree (
<div class="para desc">
<h4>解説</h4>
<p>論理ドライブ上の空き領域のサイズをクラスタ単位で取得します。返されたファイル システム オブジェクトの<tt>csize</tt>メンバがクラスタあたりのセクタ数を示しているので、これを元にセクタ単位の空きサイズが計算できます。FAT32ボリュームにおいては、FSINFOの情報が実際の空きクラスタ数と同期していない場合、不正確な値を返す可能性があります。この問題を避けるため、<tt>_FS_NOFSINFO</tt>オプションでマウント後の初回は必ずフルFATスキャンをするように構成することもできます。</p>
<p>論理ドライブ上の空き領域のサイズをクラスタ単位で取得します。返されたファイル システム オブジェクトの<tt>csize</tt>メンバがクラスタあたりのセクタ数を示しているので、これを元にセクタ単位の空きサイズが計算できます。FAT32ボリュームにおいては、FSINFOの情報が実際の空きクラスタ数と同期していない場合、不正確な値を返す可能性があります。この問題を避けるため、<tt><a href="config.html#fs_nofsinfo">_FS_NOFSINFO</a></tt>オプションでマウント後の初回は必ずフルFATスキャンをするように構成することもできます。</p>
</div>

View File

@@ -44,14 +44,14 @@ TCHAR* f_gets (
<div class="para desc">
<h4>解説</h4>
<p>この関数は<a href="read.html"><tt>f_read()</tt></a>のラッパー関数です。読み出し動作は、最初の<tt>'\n'</tt>を読み込むか、ファイル終端に達するか、<tt class="arg">len</tt> - 1文字を読み出すまで続きます。読み込まれた文字列の終端には<tt>'\0'</tt>が付加されます。既にファイル終端で1文字も読み込まれなかったとき、または何らかのエラーが発生したときは関数は失敗しヌル ポインタを返します。ファイル終端かエラーかは<tt>f_eof()</tt>,<tt>f_error()</tt>マクロで調べられます。</p>
<p>読み出し動作は、最初の<tt>'\n'</tt>を読み込むか、ファイル終端に達するか、<tt class="arg">len</tt> - 1文字を読み出すまで続きます。読み込まれた文字列の終端には<tt>'\0'</tt>が付加されます。既にファイル終端で1文字も読み込まれなかったとき、または何らかのエラーが発生したときは関数は失敗しヌル ポインタを返します。ファイル終端かエラーかは<tt>f_eof/f_error</tt>関数で調べられます。</p>
<p>Unicode API構成(<tt>_LFN_UNICODE == 1</tt>)が選択されているときは、<tt class="arg">buff</tt>はUTF-16文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で読み出します。</p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2のときは、ファイルに含まれる<tt>'\r'</tt>が取り除かれてバッファに読み込まれます。</p>
<p>この関数は<a href="read.html"><tt>f_read</tt></a>関数のラッパー関数です。<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2のときは、ファイルに含まれる<tt>'\r'</tt>が取り除かれてバッファに読み込まれます。</p>
</div>

View File

@@ -39,7 +39,6 @@ FRESULT f_lseek (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>,
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>
@@ -49,19 +48,19 @@ FRESULT f_lseek (
<div class="para desc">
<h4>解説</h4>
<p>ファイルのリード/ライト ポインタ(次に読み出し・書き込みされるバイトのオフセット)を移動します。オフセットの原点はファイル先頭です。書き込みモードでファイル サイズより大きな値を指定すると、そこまでファイル サイズが拡張され、拡張された部分のデータは未定義となります。データを遅延無く高速に書き込みたいときは、予めこの関数で必要なサイズまでファイル サイズを拡張しておくと良いでしょう。<tt>f_lseek()</tt>が正常終了したあとは、リード/ライト ポインタが正しく移動したかチェックするべきです。リード/ライト ポインタが指定より小さいときは、次の原因が考えられます。</p>
<p>ファイルのリード/ライト ポインタ(次に読み出し・書き込みされるバイトのオフセット)を移動します。オフセットの原点はファイル先頭です。書き込みモードでファイル サイズより大きな値を指定すると、そこまでファイル サイズが拡張され、拡張された部分のデータは未定義となります。データを遅延無く高速に書き込みたいときは、予めこの関数で必要なサイズまでファイル サイズを拡張しておくと良いでしょう。<tt>f_lseek</tt>関数が正常終了したあとは、リード/ライト ポインタが正しく移動したかチェックするべきです。リード/ライト ポインタが指定より小さいときは、次の原因が考えられます。</p>
<ul>
<li>非書き込みモードまたは高速シーク モードのため、ファイル サイズでクリップされた。</li>
<li>ファイル拡張中にディスクが満杯になった。</li>
</ul>
<p><tt>_USE_FASTSEEK</tt>が1で、且つファイル オブジェクトの<tt>cltbl</tt>メンバがNULL以外(<tt>f_open()</tt>でNULLに設定される)のとき、高速シーク モードになります。これはファイルのクラスタ配置情報(CLMT)をメモリ上に保持しておくことにより、FATにアクセスすることなく後方シークやロング シークを高速に行う機能です。高速シーク モードは、<tt>f_read()/f_wtite()</tt>の動作にも適用されます。高速シーク モード<tt>f_wtite()/f_lseek()</tt>によるファイル サイズの拡張はできません。</p>
<p>高速シーク動作を行う前に、CLMTを作成しておく必要があります。これを作成するには、まずCLMT格納バッファ(<tt>DWORD</tt>型配列)を準備し、<tt>cltbl</tt>メンバにそのポインタをセットします。そして、配列の先頭要素にその配列のサイズ(要素数)を入れ、<tt>f_lseek()</tt><tt class="arg">ofs</tt><tt>CREATE_LINKMAP</tt>を指定して呼び出します。関数が成功するとCLMTが作成され、以降の<tt>f_read()/f_write()/f_lseek()</tt>ではFATへのアクセスは発生しません。<tt>FR_NOT_ENOUGH_CORE</tt>で失敗したときは配列サイズが不足で、先頭要素には実際に必要となる要素数が返されます。必要な要素数は、(ファイルの分割数 + 1) * 2 です。たとえば、ファイルが5つのフラグメントに分断されているときに必要な要素数は、12となります。</p>
<p>高速シーク モードは、ファイルのクラスタ配置情報(CLMT)をメモリ上に保持しておくことにより、FATにアクセスすることなく後方シークやロング シークを高速に行う機能で、シーク動作のほか<tt>f_read/f_wtite</tt>関数の動作にも適用されます。ファイルが高速シーク モードの間<tt>f_wtite/f_lseek</tt>関数によるファイル サイズの拡張はできません。</p>
<p>高速シーク モードは、ファイル オブジェクトのメンバ<tt>cltbl</tt>(<tt>f_open</tt>関数でNULLになる)にNULL以外を設定したとき有効になるので、まずCLMTを作成しておく必要があります。これを作成するには、まずCLMT格納バッファ(<tt>DWORD</tt>型配列)を準備し、<tt>cltbl</tt>にそのポインタをセットします。そして、配列の先頭要素にその配列のサイズ(要素数)を入れ、<tt>f_lseek</tt>関数<tt class="arg">ofs</tt><tt>CREATE_LINKMAP</tt>を指定して呼び出します。関数が成功するとCLMTが作成され、以降の<tt>f_read/f_write/f_lseek</tt>関数ではFATへのアクセスは発生しません。CLMTの先頭要素には実際に使用した(または必要となる)要素数が返されます。使用される要素数は、(ファイルの分割数 + 1) * 2 です。たとえば、ファイルが5つのフラグメントに分断されているときは、12要素が使用されます。<tt>FR_NOT_ENOUGH_CORE</tt>で失敗したときは、配列サイズが不足です。</p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_MINIMIZE &lt; 3</tt>のとき使用可能です。</p>
<p><tt>_FS_MINIMIZE &lt; 3</tt>のとき使用可能です。高速シーク モードを利用するときは、<tt><a href="config.html#use_fastseek">_USE_FASTSEEK</a> == 1</tt>である必要があります。</p>
</div>
@@ -107,6 +106,8 @@ FRESULT f_lseek (
DWORD clmt[SZ_TBL]; <span class="c">/* リンク マップ テーブル格納バッファ */</span>
res = f_open(fp, fname, FA_READ | FA_WRITE); <span class="c">/* ファイルを開く */</span>
res = f_lseek(fp, ofs1); <span class="c">/* 通常シーク (オープン時、cltblはNULLに初期化される) */</span>
fp-&gt;cltbl = clmt; <span class="c">/* 高速シーク機能の有効化 */</span>

View File

@@ -13,7 +13,7 @@
<div class="para func">
<h2>f_mkdir</h2>
<p>ディレクトリを作成します。</p>
<p>サブ ディレクトリを作成します。</p>
<pre>
FRESULT f_mkdir (
const TCHAR* <span class="arg">path</span> <span class="c">/* [IN] 作成するディレクトリ名へのポインタ */</span>
@@ -53,7 +53,7 @@ FRESULT f_mkdir (
<div class="para desc">
<h4>解説</h4>
<p>空のディレクトリを作成します。</p>
<p>空のサブ ディレクトリを作成します。ディレクトリを削除するときは<a href="unlink.html"><tt>f_unlink</tt></a>関数を使用してください。</p>
</div>

View File

@@ -13,7 +13,7 @@
<div class="para func">
<h2>f_mkfs</h2>
<p>論理ドライブ上にFATボリュームを作成(フォーマット)します。</p>
<p>論理ドライブ上にFATボリュームを作成します。</p>
<pre>
FRESULT f_mkfs (
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] 論理ドライブ番号 */</span>
@@ -27,7 +27,7 @@ FRESULT f_mkfs (
<h4>引数</h4>
<dl class="par">
<dt>path</dt>
<dd>フォーマット対象の論理ドライブを示す<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。ドライブ番号を含まない場合は、カレント ドライブを意味します。</dd>
<dd>対象の論理ドライブを示す<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。ドライブ番号を含まない場合は、カレント ドライブを意味します。</dd>
<dt>sfd</dt>
<dd>パーテーション形式。(0(FDISK) または 1(SFD))</dd>
<dt>au</dt>
@@ -49,8 +49,8 @@ FRESULT f_mkfs (
<div class="para desc">
<h4>説明</h4>
<p>物理ドライブ上にFATボリュームを作成します。FDISK形式が指定された場合は、物理ドライブ全体を占める基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。SFD形式では、FATボリュームが物理ドライブの先頭セクタからベタで作成されます。</p>
<p>フォーマットする論理ドライブがマルチ パーテーション機能(<tt>_MULTI_PARTITION</tt>)によって特定の区画(14)に結び付けられている場合は、その区画の中にFATボリュームが作成されます。<tt class="arg">sfd</tt>は無視され、また対応する物理ドライブはこれに先立ち、<tt>f_fdisk()</tt>または他のツールで適切に区画設定されている必要があります。</p>
<p>物理ドライブ上にFATボリュームを作成(フォーマット)します。FDISK形式が指定された場合は、物理ドライブ全体を占める基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。SFD形式では、FATボリュームが物理ドライブの先頭セクタからベタで作成されます。</p>
<p>マルチ パーテーション機能(<tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>)が有効で、かつフォーマット対象の論理ドライブが特定の区画(14)に結び付けられている場合は、その区画の中に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>
@@ -66,7 +66,7 @@ FRESULT f_mkfs (
<div class="para use">
<h4>使用例</h4>
<pre>
<span class="c">/* Format the default drive */</span>
<span class="c">/* Format default drive and create a file */</span>
int main (void)
{
FATFS fs; <span class="c">/* File system object (volume work area) */</span>
@@ -75,7 +75,7 @@ int main (void)
UINT bw; <span class="c">/* Bytes written */</span>
<span class="c">/* Register work area */</span>
<span class="c">/* Register work area (do not care about error) */</span>
f_mount(&amp;fs, "", 0);
<span class="c">/* Create FAT volume with default cluster size */</span>
@@ -83,19 +83,18 @@ int main (void)
if (res) ...
<span class="c">/* Create a file as new */</span>
res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
res = f_open(&amp;fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
if (res) ...
<span class="c">/* Write a message */</span>
f_write(&fil, "Hello, World!\r\n", 15, &bw);
f_write(&amp;fil, "Hello, World!\r\n", 15, &amp;bw);
if (bw != 15) ...
<span class="c">/* Close the file */</span>
f_close(&fil);
f_close(&amp;fil);
<span class="c">/* Unregister work area */</span>
f_mount(0, "", 0);
</pre>
</div>

View File

@@ -27,7 +27,7 @@ FRESULT f_mount (
<h4>引数</h4>
<dl class="par">
<dt>fs</dt>
<dd>登録するファイル システム オブジェクトへのポインタ</dd>
<dd>登録するファイル システム オブジェクトへのポインタ、またはヌル ポインタ</dd>
<dt>path</dt>
<dd>対象となる論理ドライブの<a href="filename.html">パス名</a>を示すヌル文字'\0'終端の文字列へのポインタを指定します。パス名にドライブ番号が含まれない場合は、デフォルト ドライブを指定したことになります。</dd>
<dt>opt</dt>
@@ -49,20 +49,20 @@ FRESULT f_mount (
<div class="para desc">
<h4>解説</h4>
<p>FatFsモジュールでは、それぞれの論理ドライブに<em>ファイル システム オブジェクト</em>というワーク エリアが必要です。この関数は論理ドライブにファイル システム オブジェクトを登録したり抹消したりします。何らかのファイル関数を使用する前に、この関数でその論理ドライブのファイル システム オブジェクトを与えておかなければなりません。<tt class="arg">fs</tt>にヌル ポインタを指定すると、その論理ドライブのファイル システム オブジェクトの登録は抹消されるだけです。登録抹消されたファイル システム オブジェクトのメモリは解放できます。操作対象の論理ドライブ上に開かれたままのファイルやディレクトリがあった場合、それらに対して作成された構造体は全て無効になります。この関数の内部処理は次のような順に行われます。</p>
<p>FatFsモジュールでは、それぞれの論理ドライブに<em>ファイル システム オブジェクト</em>というワーク エリアが必要です。この関数は論理ドライブにファイル システム オブジェクトを登録したり抹消したりします。何らかのファイル関数を使用する前に、この関数でその論理ドライブのファイル システム オブジェクトを与えておかなければなりません。<tt class="arg">fs</tt>にヌル ポインタを指定すると、その論理ドライブのファイル システム オブジェクトの登録は抹消されるだけです。登録抹消されたファイル システム オブジェクトのメモリは解放できます。操作対象の論理ドライブ上に開かれたままのファイルやディレクトリがあった場合、それらに対して作成された構造体は全て無効になります。この関数の内部処理は次のような順に行われます。</p>
<ol>
<li>対象の論理ドライブを<tt class="arg">path</tt>から得る。</li>
<li>既に登録されているファイル システム オブジェクトはクリアし、登録を解除する。</li>
<li>既に登録されているファイル システム オブジェクトはクリア(無効化)し、登録を解除する。</li>
<li><tt class="arg">fs</tt>が有効なポインタのときは、そのファイル システム オブジェクトをクリアし登録する。</li>
<li>マウント動作が指定されているときは、それを実行する。</li>
</ol>
<p><tt class="arg">opt</tt>に0を指定すると、マウント動作(物理ドライブの初期化、FATボリュームの検索、BPBを解析しファイル システム オブジェクトを初期化)は行われず、関数は物理ドライブの状態に関わらず常に成功します。関数内では下位レイヤへのアクセスは発生せず、指定されたファイル システム オブジェクトをクリア(無効化)し、そのアドレスを内部配列に登録するだけです。単に登録済みのファイル システム オブジェクトをクリアする目的にも使えます。実際のマウント動作は、ボリュームへのアクセス(パス名を渡すもの全て)が行われたときに、次のうちいずれかの条件が真の場合に行われます。</p>
<ul>
<li>ファイル システム オブジェクトがクリア(無効)状態(<tt>f_mount()</tt>の実行による)</li>
<li>ファイル システム オブジェクトがクリア(無効)状態(<tt>f_mount</tt>関数の実行による)</li>
<li>物理ドライブが未初期化状態(システム リセットやメディアの交換による)</li>
</ul>
<p><tt class="arg">opt</tt>に1を指定すると、ファイル システムオブジェクトの登録に続きマウント動作が行われます。メディアが無いなどの理由でマウント動作に失敗すると対応するエラーを返しファイル システム オブジェクト無効状態のままになりますが、登録自体は有効なので続いてボリュームへのアクセスがあれば再びマウント動作が実行されます。</p>
<p>下位レイヤの実装上メディア交換の検出がサポートされない(<tt>disk_status()</tt>に反映されない)ときは、アプリケーションはメディア交換の後この関数でファイル システム オブジェクトを明示的にクリアし、マウント動作が正常に行えるようにする必要があります。</p>
<p><tt class="arg">opt</tt>に1を指定すると、ファイル システムオブジェクトの登録に続きマウント動作が行われます。メディアが無いなどの理由でマウント動作に失敗すると対応するエラーを返しファイル システム オブジェクトはクリア状態のままになりますが、登録自体は有効なので続いてボリュームへのアクセスがあれば再びマウント動作が実行されます。</p>
<p>下位レイヤの実装上メディア交換の検出がサポートされない(<tt>disk_status</tt>関数に反映されない)ときは、アプリケーションはメディア交換の後この関数でファイル システム オブジェクトを明示的にクリアし、マウント動作が正常に行えるようにする必要があります。</p>
</div>

View File

@@ -37,7 +37,7 @@ FRESULT f_open (
<tr><td>FA_READ</td><td>読み出しモードで開きます。読み書きする場合は<tt>FA_WRITE</tt>と共に指定します。</td></tr>
<tr><td>FA_WRITE</td><td>書き込みモードで開きます。読み書きする場合は<tt>FA_READ</tt>と共に指定します。</td></tr>
<tr><td>FA_OPEN_EXISTING</td><td>既存のファイルを開きます。ファイルが無いときはエラーになります。(デフォルト)</td></tr>
<tr><td>FA_OPEN_ALWAYS</td><td>既存のファイルを開きます。ファイルが無いときはファイルを作成します。追記の場合は、この方法でオープンした後、<a href="lseek.html"><tt>f_lseek()</tt></a>でファイルの最後尾に移動してください。</td></tr>
<tr><td>FA_OPEN_ALWAYS</td><td>既存のファイルを開きます。ファイルが無いときはファイルを作成します。追記の場合は、この方法でオープンした後、<a href="lseek.html"><tt>f_lseek</tt></a>関数でファイルの最後尾に移動してください。</td></tr>
<tr><td>FA_CREATE_NEW</td><td>ファイルを作成します。同名のファイルがある場合は、<tt>FR_EXIST</tt>で失敗します。</td></tr>
<tr><td>FA_CREATE_ALWAYS</td><td>ファイルを作成します。同名のファイルがある場合は、サイズを0にしてから開きます。</td></tr>
</table>
@@ -73,9 +73,9 @@ FRESULT f_open (
<div class="para desc">
<h4>解説</h4>
<p>既存のファイルを開いたり、新しいファイルを作成します。関数が成功するとファイル オブジェクトが作成され、以降そのファイルに対するアクセスに使用します。ファイルを閉じるときは、<a href="close.html"><tt>f_close()</tt></a>を使用します。何らかの変更が行われたファイルがその後正しく閉じられなかった場合、そのファイルが破損する場合があります。</p>
<p>既存のファイルを開いたり、新しいファイルを作成します。関数が成功するとファイル オブジェクトが作成され、以降そのファイルに対するアクセスに使用します。ファイルを閉じるときは、<a href="close.html"><tt>f_close</tt></a>関数を使用します。何らかの変更が行われたファイルがその後正しく閉じられなかった場合、そのファイルが破損する場合があります。</p>
<p>既に開かれているファイルを開く必要がある場合は、<a href="appnote.html#dup">多重アクセス制御</a>を参照してください。しかし、一つのファイルに対する書き込みモードを含む重複オープンは常に禁止です。</p>
<p>ファイル アクセスを開始する前に、<a href="mount.html"><tt>f_mount()</tt></a>を使ってそれぞれの論理ドライブにワーク エリア(ファイル システム オブジェクト)を与える必要があります。この初期化の後、その論理ドライブに対して全てのファイル関数が使えるようになります。</p>
<p>ファイル アクセスを開始する前に、<a href="mount.html"><tt>f_mount</tt></a>関数を使ってそれぞれの論理ドライブにワーク エリア(ファイル システム オブジェクト)を与える必要があります。この初期化の後、その論理ドライブに対して全てのファイル関数が使えるようになります。</p>
</div>

View File

@@ -28,7 +28,7 @@ FRESULT f_opendir (
<dt>dp</dt>
<dd>空のディレクトリ オブジェクト構造体へのポインタを指定します。</dd>
<dt>path</dt>
<dd>オープンするディレクトリの<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。</dd>
<dd>開くディレクトリの<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。</dd>
</dl>
</div>
@@ -50,13 +50,12 @@ FRESULT f_opendir (
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>,
<a href="rc.html#tf">FR_TOO_MANY_OPEN_FILES</a>
</p>
</div>
<div class="para desc">
<h4>解説</h4>
<p>ディレクトリを開きます。正常終了したら、作成された<tt>DIR</tt>構造体を使ってこのディレクトリの項目を順次読み出せます。</p>
<p>ディレクトリを開きます。正常終了したら、作成されたディレクトリ オブジェクト構造体を使ってこのディレクトリの項目を順次読み出せます。</p>
</div>

View File

@@ -45,7 +45,7 @@ int f_printf (
<div class="para desc">
<h4>解説</h4>
<p>この関数は、<a href="putc.html"><tt>f_putc()</tt></a>および<a href="puts.html"><tt>f_puts()</tt></a>のラッパー関数です。書式制御機能はC標準ライブラリのサブセットとなっていて、書式制御文字は次に示すものが使用可能です。</p>
<p>書式制御機能はC標準ライブラリのサブセットとなっていて、書式制御文字は次に示すものが使用可能です。</p>
<ul>
<li>タイプ: <tt>c C s S d D u U x X b B</tt></li>
<li>精度指定: <tt>l L</tt></li>
@@ -56,7 +56,7 @@ int f_printf (
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能になります。2の時は、出力に含まれる<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
<p>この関数は、<a href="putc.html"><tt>f_putc</tt></a>関数および<a href="puts.html"><tt>f_puts</tt></a>関数のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能になります。2の時は、出力に含まれる<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<tt class="arg">fmt</tt>はUnicode文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
</div>

View File

@@ -42,13 +42,13 @@ int f_putc (
<div class="para desc">
<h4>解説</h4>
<p>1文字をファイルに書き込みます。この関数は<a href="write.html"><tt>f_write()</tt></a>のラッパー関数です。</p>
<p>1文字をファイルに書き込みます。</p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が 1または 2のとき使用可能です。2を指定すると、<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
<p>この関数は<a href="write.html"><tt>f_write</tt></a>関数のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が 1または 2のとき使用可能です。2を指定すると、<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
</div>

View File

@@ -42,13 +42,13 @@ int f_puts (
<div class="para desc">
<h4>解説</h4>
<p>文字列をファイルに書き込みます。この関数は<a href="write.html"><tt>f_write()</tt></a>のラッパー関数です。</p>
<p>文字列をファイルに書き込みます。</p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2を指定すると、文字列に含まれる<tt>'\n'</tt><tt>'\r'+'\n'<tt>に展開されてファイルに書き込まれます。</p>
<p>この関数は<a href="write.html"><tt>f_write</tt></a>関数のラッパー関数です。<tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2を指定すると、文字列に含まれる<tt>'\n'</tt><tt>'\r'+'\n'<tt>に展開されてファイルに書き込まれます。</p>
</div>

View File

@@ -17,7 +17,7 @@
<dt id="ok">FR_OK (0)</dt>
<dd>関数は成功した。</dd>
<dt id="de">FR_DISK_ERR</dt>
<dd>下位レイヤ(<tt>disk_read(), disk_write(), disk_ioctl()</tt>関数)で回復不能なエラーが発生した。<br>※開かれたファイルの操作においてこのエラーが発生すると、そのファイル オブジェクトはアボート状態となり、クローズ以外のの操作ができなくなります。</dd>
<dd>下位レイヤ(<tt>disk_read/disk_write/disk_ioctl</tt>関数)で回復不能なエラーが発生した。<br>※開かれたファイルの操作においてこのエラーが発生すると、そのファイル オブジェクトはアボート状態となり、クローズ以外のの操作ができなくなります。</dd>
<dt id="ie">FR_INT_ERR</dt>
<dd>内部処理の健全性に異常が検出された。原因としては次のようなことが考えられます。
<ul>
@@ -26,7 +26,7 @@
</ul>
※開かれたファイルの操作においてこのエラーが発生すると、そのファイル オブジェクトはアボート状態となり、クローズ以外の操作ができなくなります。</dd>
<dt id="nr">FR_NOT_READY</dt>
<dd>物理ドライブが動作可能な状態にない。または、ドライブの初期化に失敗した</dd>
<dd><a href="dinit.html"><tt>disk_initialize</tt>関数</a>の失敗。物理ドライブが動作可能な状態にない。</dd>
<dt id="nf">FR_NO_FILE</dt>
<dd>指定されたファイルが見つからなかった。</dd>
<dt id="np">FR_NO_PATH</dt>
@@ -47,39 +47,46 @@
<dt id="ex">FR_EXIST</dt>
<dd>新しく作成しようとしたオブジェクトと同じ名前のオブジェクトが既に存在する。</dd>
<dt id="io">FR_INVALID_OBJECT</dt>
<dd>指定されたファイル オブジェクトやディレクトリ オブジェクトが無効(オープンされていない、既に閉じられた、破損しているなど)、またはヌル ポインタが渡された。また、開かれたままのオブジェクトは、それの属するボリュームのマウント動作により無効となります。</dd>
<dd>指定されたファイル オブジェクトやディレクトリ オブジェクトが無効、またはヌル ポインタが渡された。無効になる理由は次のことが考えられます。
<ul>
<li>オープンされていない、既に閉じられた、破損しているなど。</li>
<li>それの属するボリュームのマウント動作があった。ボリューム上で開かれたオブジェクトは全て無効化される。</li>
<li>関連する物理ドライブがメディアの取り外しで動作不可能になっている。</li>
</ul>
</dd>
<dt id="wp">FR_WRITE_PROTECTED</dt>
<dd>物理ドライブが書き込み禁止状態のとき、書き込みを伴う操作を行おうとした。</dd>
<dt id="id">FR_INVALID_DRIVE</dt>
<dd>パス名中に指定されたドライブ番号が無効、またはパス名にヌル ポインタが渡された。(関連オプション: <tt>_VOLUMES</tt>)</dd>
<dd>パス名中に指定されたドライブ番号が無効、またはパス名にヌル ポインタが渡された。(関連オプション: <tt><a href="config.html#volumes">_VOLUMES</a></tt>)</dd>
<dt id="ne">FR_NOT_ENABLED</dt>
<dd>そのボリュームの操作に必要なワーク エリア(ファイル システム オブジェクト構造体)が与えられていない。</dd>
<dt id="ns">FR_NO_FILESYSTEM</dt>
<dd>物理ドライブ上に有効なFATボリュームが見つからなかった。</dd>
<dt id="ma">FR_MKFS_ABORTED</dt>
<dd><tt>f_mkfs()</tt>の処理が開始前に中断された。原因としては次のようなことが考えられます。
<dd><tt>f_mkfs</tt>関数の処理が開始前に中断された。原因としては次のようなことが考えられます。
<ul>
<li>ボリュームが小さすぎる。</li>
<li>FATタイプの計算に矛盾が見つかった。クラスタ数がFATタイプの境界付近になるときに発生する場合があります。</li>
<li>その論理ドライブに対応する区画が見つからなかった。(関連オプション: <tt>_MULTI_PARTITION</tt>)</li>
<li>その論理ドライブに対応する区画が見つからなかった。(関連オプション: <tt><a href="config.html#multi_partition">_MULTI_PARTITION</a></tt>)</li>
</ul>
</dd>
<dt id="tm">FR_TIMEOUT</dt>
<dd><a href="appnote.html#reentrant">再入制御</a>による待ち時間が定義された時間を越えたため、関数は実行されなかった。(関連オプション: <tt>_TIMEOUT</tt>)</dd>
<dd><a href="appnote.html#reentrant">再入制御</a>による待ち時間が定義された時間を越えたため、関数は実行されなかった。(関連オプション: <tt><a href="config.html#timeout">_TIMEOUT</a></tt>)</dd>
<dt id="lo">FR_LOCKED</dt>
<dd><a href="appnote.html#dup">多重アクセス排他機能</a>により、そのファイルやディレクトリに対して行おうとしたアクセスが拒否された。(関連オプション: <tt>_FS_LOCK</tt>)</dd>
<dd><a href="appnote.html#dup">多重アクセス排他機能</a>により、そのファイルやディレクトリに対して行おうとしたアクセスが拒否された。(関連オプション: <tt><a href="config.html#fs_lock">_FS_LOCK</a></tt>)</dd>
<dt id="nc">FR_NOT_ENOUGH_CORE</dt>
<dd>メモリ不足による失敗。原因としては次のようなことが考えられます。
<ul>
<li>LFN操作バッファの動的確保に失敗した。(関連オプション: <tt>_USE_LFN</tt>)</li>
<li>LFN操作バッファの動的確保に失敗した。(関連オプション: <tt><a href="config.html#use_lfn">_USE_LFN</a></tt>)</li>
<li>与えられた配列のサイズが実際に必要なサイズに対して不足している。</li>
</ul>
</dd>
<dt id="tf">FR_TOO_MANY_OPEN_FILES</dt>
<dd>同時オープン可能なファイル数を越えてファイルを開こうとした。(関連オプション: <tt>_FS_LOCK</tt>)</dd>
<dd>同時オープン可能なファイル数を越えてファイルを開こうとした。(関連オプション: <tt><a href="config.html#fs_lock">_FS_LOCK</a></tt>)</dd>
<dt id="ip">FR_INVALID_PARAMETER</dt>
<dd>与えられたパラメータが無効または矛盾している。</dd>
</dl>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
</body>
</html>

View File

@@ -45,7 +45,6 @@ FRESULT f_read (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>

View File

@@ -26,7 +26,7 @@ FRESULT f_readdir (
<h4>引数</h4>
<dl class="par">
<dt>dp</dt>
<dd>有効なディレクトリ オブジェクト構造体へのポインタを指定します。</dd>
<dd><tt>f_opendir</tt>関数で作成された有効なディレクトリ オブジェクトへのポインタを指定します。</dd>
<dt>fno</dt>
<dd>読み出したディレクトリ項目を格納するファイル情報構造体へのポインタを指定します。</dd>
</dl>
@@ -39,7 +39,6 @@ FRESULT f_readdir (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>,
<a href="rc.html#nc">FR_NOT_ENOUGH_CORE</a>
@@ -49,15 +48,14 @@ FRESULT f_readdir (
<div class="para desc">
<h4>解説</h4>
<p>ディレクトリの項目(ファイルディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fname[]</tt>メンバにヌル文字列が返されます。<tt class="arg">fno</tt>にヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。</p>
<p>ドット エントリ("."、"..")は、相対パスが有効なとき(<tt>_FS_RPATH &gt;= 1</tt>)にのみ出力に現れます。</p>
<p>LFN機能が有効な時は、この関数の呼び出しに先立って<tt>FILINFO</tt>構造体の<tt>lfname</tt><tt>lfsize</tt>が有効な値で初期化されていなければなりません。<tt>lfname</tt>はLFNを格納するバッファ<tt>lfsize</tt>はそのバッファの要素数す。LFNを読み出す必要がないときは、<tt>lfname</tt>にヌル ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。</p>
<p>ディレクトリの項目(ファイルおよびサブ ディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fno-&gt;fname[]</tt>にヌル文字列が返されます。<tt class="arg">fno</tt>にヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。</p>
<p>ドット エントリ(<tt>"."</tt><tt>".."</tt>)は、相対パスが有効なとき(<tt><a href="config.html#fs_rpath">_FS_RPATH</a> &gt;= 1</tt>)にのみ出力に現れます。</p>
<p>LFN機能が有効な時は、この関数の呼び出しに先立って<tt>fno-&gt;lfname</tt><tt>fno-&gt;lfsize</tt>が有効な値で初期化されていなければなりません。<tt>lfname</tt>はLFNを格納するバッファを示し<tt>lfsize</tt>はそのバッファの要素数を示します。LFNを読み出す必要がないときは、<tt>lfname</tt>にヌル ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。</p>
<ul>
<li>ディレクトリ項目にLFN情報が存在しない。</li>
<li>その項目にLFNが存在しない。このとき、<tt>fname[]</tt>に英小文字が含まれる場合があります。</li>
<li>LFNの長さに対してLFN格納バッファまたはLFN操作バッファのサイズが不十分。</li>
<li>LFNに現在のOEMコードに存在しない文字が含まれている。(非Unicode構成のとき)</li>
<li>LFNに現在のOEMコードで表現できない文字が含まれている。(非Unicode構成のとき)</li>
</ul>
<p>また、ディレクトリ項目にLFN情報が存在しない場合は、<tt>fname[]</tt>に英小文字が含まれる場合があります。</p>
</div>

View File

@@ -56,7 +56,7 @@ FRESULT f_rename (
<div class="para desc">
<h4>解説</h4>
<p>ファイルまたはサブ ディレクトリの名前を変更します。また、同時に別のディレクトリへの移動も可能ですが、異なるドライブの移動はできません。<em>開かれているオブジェクトに対して使用してはなりません</em></p>
<p>ファイルまたはサブ ディレクトリの名前を変更します。また、同時に別のディレクトリへの移動も可能ですが、異なるドライブの移動はできません。開かれているオブジェクトに対する使用は不正な操作となり、<em>FAT構造が破壊される可能性</em>があります。<a href="appnote.html#dup">多重アクセス制御</a>が有効のときは安全に拒否されます</p>
</div>
@@ -69,11 +69,14 @@ FRESULT f_rename (
<div class="para use">
<h4>使用例</h4>
<pre>
<span class="c">/* ファイルまたはサブディレクトの名前を変更する */</span>
<span class="c">/* デフォルト ドライブにあるオブジェクトの名前を変更 */</span>
f_rename("oldname.txt", "newname.txt");
<span class="c">/* ファイルまたはサブディレクトの名前変更と別のディレクトリへの移動 */</span>
f_rename("oldname.txt", "dir1/newname.txt");
<span class="c">/* ドライブ2にあるオブジェクトの名前変更 */</span>
f_rename("2:oldname.txt", "newname.txt");
<span class="c">/* 名前の変更と同時に別のディレクトリに移動 */</span>
f_rename("log.txt", "old/log0001.txt");
</pre>
</div>

View File

@@ -13,7 +13,7 @@
<div class="para">
<h2>DIR</h2>
<p><tt>DIR</tt>構造体は、<tt>f_opendir(), f_readdir()</tt>のワーク エリアとして使用されます。アプリケーションは、この構造体のメンバを書き換えてはなりません。</p>
<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>
@@ -22,15 +22,18 @@
DWORD sclust; <span class="c">/* テーブル開始クラスタ (0:ルート) */</span>
DWORD clust; <span class="c">/* 現在のクラスタ番号 */</span>
DWORD sect; <span class="c">/* 現在のセクタ番号 */</span>
BYTE* dir; <span class="c">/* 現在のSFNエントリへのポインタ */</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 */</span>
UINT lockid; <span class="c">/* サブ ディレクトリ ロックID (0:ルート) */</span>
<span class="k">#endif</span>
<span class="k">#if</span> _USE_LFN
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>
<span class="k">#endif</span>
} DIR;
</pre>
</div>

View File

@@ -51,10 +51,11 @@ FRESULT f_setlabel (
<h4>解説</h4>
<p>文字列の先頭にドライブ番号を含む場合は、その論理ドライブに対して設定されます。含まない場合は、デフォルト ドライブに設定されます。ボリューム ラベルを削除するときは、ヌル文字列を指定します。ボリューム ラベルのフォーマットは、ファイル名(SFN)とほぼ同じですが、次の点が異なります。</p>
<ul>
<li>ローカル文字コード換算で11バイト以下。LFN拡張は適用されません。</li>
<li>OEMコード換算で11バイト以下。ボリューム ラベルにはLFN拡張は適用されません。</li>
<li>ピリオドを含むことはできない。</li>
<li>任意の位置にスペースを置くことができる。ただし、最後尾となるスペースは除去される。</li>
</ul>
<p>【補足】 標準システム(Windows)では<tt>\xE5</tt>で始まるボーリューム ラベル(CP932なら「薔薇」など)の扱いに問題があります。このため、この関数ではそのような名前は無効として処理しています。</p>
</div>
<div class="para comp">

View File

@@ -13,16 +13,16 @@
<div class="para">
<h2>FATFS</h2>
<p><tt>FATFS</tt>構造体(ファイル システム オブジェクト)は、個々の論理ドライブのダイナミック ワーク エリアを保持し、<tt>f_mount()</tt>でFatFsモジュールに登録されます。初期化が行われるタイミングは、<tt>f_mount()</tt>(強制マウント指定)の実行またはメディア交換の後の最初のファイル アクセスの時です。アプリケーションは、この構造体のメンバを書き換えてはなりません。</p>
<p><tt>FATFS</tt>構造体(ファイル システム オブジェクト)は、個々の論理ドライブのダイナミック ワーク エリアを保持し、<tt>f_mount</tt>関数でFatFsモジュールに登録されます。初期化が行われるタイミングは、<tt>f_mount</tt>関数(強制マウント指定)の実行またはメディア交換の後の最初のファイル アクセスの時です。アプリケーションは、この構造体のメンバを書き換えてはなりません。</p>
<pre>
<span class="k">typedef</span> <span class="k">struct</span> {
BYTE fs_type; <span class="c">/* FATタイプ */</span>
BYTE fs_type; <span class="c">/* FATタイプ (0:無効, FS_FAT12, FS_FAT16 or FS_FAT32) */</span>
BYTE drv; <span class="c">/* 物理ドライブ番号 */</span>
BYTE csize; <span class="c">/* クラスタ当たりのセクタ数 (1,2,4,8,...,128)*/</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>
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>
<span class="k">#if</span> _MAX_SS != _MIN_SS
@@ -36,13 +36,13 @@
DWORD free_clust; <span class="c">/* FSINFO: 空きクラスタ数 */</span>
<span class="k">#endif</span>
<span class="k">#if</span> _FS_RPATH
DWORD cdir; <span class="c">/* カレント ディレクトリのクラスタ (0:ルート) */</span>
DWORD cdir; <span class="c">/* カレント ディレクトリのクラスタ番号 (0:ルート) */</span>
<span class="k">#endif</span>
DWORD n_fatent; <span class="c">/* FATエントリ数 (総クラスタ数 + 2) */</span>
DWORD fsize; <span class="c">/* FAT 1個のセクタ数 */</span>
DWORD volbase; <span class="c">/* ボリューム開始セクタ */</span>
DWORD fatbase; <span class="c">/* FAT領域開始セクタ */</span>
DWORD dirbase; <span class="c">/* ルート ディレクトリ領域開始セクタ(クラスタ) */</span>
DWORD dirbase; <span class="c">/* ルート ディレクトリ領域開始(セクタ|クラスタ) */</span>
DWORD database; <span class="c">/* データ領域開始セクタ */</span>
DWORD winsect; <span class="c">/* win[]に現れているセクタ番号 */</span>
BYTE win[_MAX_SS]; <span class="c">/* ディスク アクセス ウィンドウ */</span>

View File

@@ -13,7 +13,7 @@
<div class="para">
<h2>FIL</h2>
<p><tt>FIL</tt>構造体(ファイル オブジェクト)は、<tt>f_open()</tt>で初期化され、以後そのファイルの状態を保持します。また、<tt>f_close()</tt>でファイルが閉じられると無効化されます。アプリケーションは、この構造体のメンバを書き換えてはなりません(<tt>cltbl</tt>は例外)。非タイニー構成(<tt>_FS_TINY == 0</tt>)では、内部に<tt>_MAX_SS</tt>バイトのセクタ バッファが確保されるので、そのサイズには注意が必要です。</p>
<p><tt>FIL</tt>構造体(ファイル オブジェクト)は、<tt>f_open</tt>関数で初期化され、以後そのファイルの状態を保持します。また、<tt>f_close</tt>関数でファイルが閉じられると無効化されます。アプリケーションは、この構造体のメンバを書き換えてはなりません(<tt>cltbl</tt>は例外)。非タイニー構成(<tt>_FS_TINY == 0</tt>)では、内部に<tt>_MAX_SS</tt>バイトのセクタ バッファが確保されるので、そのサイズには注意が必要です。</p>
<pre>
<span class="k">typedef</span> <span class="k">struct</span> {
@@ -24,7 +24,7 @@
DWORD fptr; <span class="c">/* ファイル読み書きポインタ (ファイル先頭からのバイト オフセット) */</span>
DWORD fsize; <span class="c">/* ファイル サイズ(バイト単位) */</span>
DWORD sclust; <span class="c">/* ファイル開始クラスタ番号 (0:割り当て無し) */</span>
DWORD clust; <span class="c">/* 現在のクラスタ */</span>
DWORD clust; <span class="c">/* 現在のクラスタ (fptrが0のときは無効、fptrがクラスタ境界上のときは前のクラスタ) */</span>
DWORD dsect; <span class="c">/* 現在のデータ セクタ */</span>
<span class="k">#if</span> !_FS_READONLY
DWORD dir_sect; <span class="c">/* このファイルのディレクトリ エントリのあるセクタ */</span>
@@ -37,7 +37,7 @@
UINT lockid; <span class="c">/* ファイル ロックID */</span>
<span class="k">#endif</span>
<span class="k">#if</span> !_FS_TINY
BYTE buf[_MAX_SS]; <span class="c">/* ファイル プライベート データ転送バッファ */</span>
BYTE buf[_MAX_SS]; <span class="c">/* ファイル プライベート データ転送バッファ (fptrがセクタ境界上にない時は常に有効だが、fptrがセクタ境界上のときは無効な場合がある) */</span>
<span class="k">#endif</span>
} FIL;
</pre>

View File

@@ -13,7 +13,7 @@
<div class="para">
<h2>FILINFO</h2>
<p><tt>FILINFO</tt>構造体は、<tt>f_stat(), f_readdir()</tt>で返されるファイル情報を保持します。</p>
<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>
@@ -58,11 +58,11 @@
<dt>fattrib</dt>
<dd>属性フラグが格納されます。フラグは<tt>AM_DIR, AM_RDO, AM_HID, AM_SYS, AM_ARC</tt>の組み合わせとなります。</dd>
<dt>fname[]</dt>
<dd>8.3形式の名前が<tt>'\0'</tt>で終わる文字列として格納されます。非LFN構成のときは、常に大文字で返されます。LFN構成のときは短い名前が返されますが、ASCII英字が小文字になる場合があります。</dd>
<dd>8.3形式の名前(SFN)<tt>'\0'</tt>で終わる文字列として格納されます。非LFN構成のときは、常に大文字で返されます。LFN構成のときは、文字列に含まれるASCII英字が小文字になる場合があります。</dd>
<dt>lfname</dt>
<dd>返される長いファイル名を格納するバッファへのポインタ。この構造体を使用する前にアプリケーションにより初期化されなければなりません。このメンバにNULLが設定されるとLFNは返されません。非LFN構成のときはこのメンバは存在しません。</dd>
<dd>長いファイル名(LFN)を格納するバッファへのポインタ。このメンバは、この構造体を使用する前にアプリケーションにより初期化されなければなりません。NULLが設定されるとLFNは返されません。非LFN構成のときはこのメンバは存在しません。</dd>
<dt>lfsize</dt>
<dd>長いファイル名を格納するバッファのサイズ(要素数)。この構造体を使用する前にアプリケーションにより初期化されなければなりません。非LFN構成のときはこのメンバは存在しません。</dd>
<dd>長いファイル名を格納するバッファのサイズ(要素数)。このメンバは、この構造体を使用する前にアプリケーションにより初期化されなければなりません。非LFN構成のときはこのメンバは存在しません。</dd>
</dl>
<p class="foot"><a href="../00index_j.html">戻る</a></p>

View File

@@ -39,7 +39,7 @@ DWORD f_size (
<div class="para desc">
<h4>解説</h4>
<p>f_size関数は、現リビジョンではマクロとして実装されています。</p>
<p>この関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_size(fp) ((fp)->fsize)
</pre>

View File

@@ -55,6 +55,7 @@ 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>

View File

@@ -36,7 +36,6 @@ FRESULT f_sync (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>
</p>
@@ -45,8 +44,8 @@ FRESULT f_sync (
<div class="para desc">
<h4>解説</h4>
<p>この関数は<tt>f_close()</tt>と同じ処理を実行しますが、ファイルは引き続き開かれたままになり、読み書きを続行できます。ロギングなど、書き込みモードで長時間ファイルが開かれているアプリケーションにおいて、定期的または区切りの良いところでこの関数を使用することにより、不意の電源断やメディアの取り外しにより失われるデータを最小にすることができます。この背景については、<a href="appnote.html#critical">アプリケーション ノート</a>も参照してください。</p>
<p>実際のところ、<tt>f_close()</tt>内ではこの関数を呼び出した後ファイル オブジェクトを無効化しているだけなので、<tt>f_close()</tt>直前に<tt>f_sync()</tt>を置くことは無意味です。</p>
<p>この関数は<tt>f_close</tt>関数と同じ処理を実行しますが、ファイルは引き続き開かれたままになり、読み書きを続行できます。ロギングなど、書き込みモードで長時間ファイルが開かれているアプリケーションにおいて、定期的または区切りの良いところでこの関数を使用することにより、不意の電源断やメディアの取り外しにより失われるデータを最小にすることができます。この背景については、<a href="appnote.html#critical">アプリケーション ノート</a>も参照してください。</p>
<p>実際のところ、<tt>f_close</tt>関数内ではこの関数を呼び出した後ファイル オブジェクトを無効化しているだけなので、<tt>f_close</tt>関数の直前に<tt>f_sync</tt>関数を置くことは無意味です。</p>
</div>

View File

@@ -39,7 +39,7 @@ DWORD f_tell (
<div class="para desc">
<h4>解説</h4>
<p>f_tell関数は、現リビジョンではマクロとして実装されています。</p>
<p>f_tell関数は、現リビジョンではマクロとして実装されています。ファイル オブジェクトの正当性チェックや排他制御は行いません。</p>
<pre>
<span class="k">#define</span> f_tell(fp) ((fp)->fptr)
</pre>

View File

@@ -36,7 +36,6 @@ FRESULT f_truncate (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>

View File

@@ -54,13 +54,12 @@ FRESULT f_unlink (
<div class="para desc">
<h4>解説</h4>
<p>削除対象のオブジェクトが次の条件に当てはまる場合、そのアクセスは拒否され関数は失敗します。
<p>削除対象のオブジェクトが次の条件に当てはまる場合、そのアクセスは拒否(<tt>FR_DENIED</tt>)され関数は失敗します。</p>
<ul>
<li>リード オンリー属性(<tt>AM_RDO</tt>)を持っている場合は、拒否(<tt>FR_DENIED</tt>)される</li>
<li>空でないサブ ディレクトリまたはカレント ディレクトリである場合は、拒否(<tt>FR_DENIED</tt>)される</li>
<li>開かれているファイルまたはサブ ディレクトである場合は、<a href="appnote.html#dup">多重アクセス制御</a>が有効なら安全に拒否(<tt>FR_LOCKED</tt>)されますが、そうでないときは不正な操作となり<em>FAT構造が破壊される可能性</em>があります</li>
<li>リード オンリー属性(<tt>AM_RDO</tt>)を持っている場合。</li>
<li>空でないサブ ディレクトリまたはカレント ディレクトリである場合。</li>
<li>開かれているオブジェクトである場合<a href="appnote.html#dup">多重アクセス制御</a>が有効のときは安全に拒否されるが、そうでないときは不正な操作となり<em>FAT構造が破壊される可能性</em>があ</li>
</ul>
</p>
</div>
<div class="para comp">

View File

@@ -45,7 +45,6 @@ FRESULT f_write (
<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#nr">FR_NOT_READY</a>,
<a href="rc.html#de">FR_DENIED</a>,
<a href="rc.html#io">FR_INVALID_OBJECT</a>,
<a href="rc.html#tm">FR_TIMEOUT</a>