FatFs R0.11, released Febrary 9, 2015
This commit is contained in:
+66
-80
@@ -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>
|
||||
@@ -48,7 +46,7 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
|
||||
<p><img src="../img/funcs.png" width="680" height="430" 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>
|
||||
@@ -62,58 +60,48 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
|
||||
</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規格に依存。(512~4096バイト)</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>次の表は構成オプションの設定値によりどの機能が削除されるかを示します。使用する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>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>
|
||||
@@ -150,50 +138,45 @@ _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>_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>
|
||||
<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地域では数万の文字が使われていますが、不幸なことにそれは巨大なOEM-Unicode相互変換テーブルを要求し、モジュール サイズは劇的に増大します。その結果、それらのコード ページにおいて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>_LFN_UNICODE</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>_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>ひとつの例外が<tt>f_mount, f_mkfs, f_fdisk</tt>関数にあります。これらの関数は同じボリューム(または関連する物理ドライブ)に対してリエントラントではありません。これらの関数を使用するときは、アプリケーション レベルで排他制御しなければなりません。</p>
|
||||
<p>注: このセクションはFatFsモジュールそれ自体のリエントランシーについて説明しています。その下位のディスク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>
|
||||
</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>
|
||||
@@ -204,11 +187,11 @@ _FS_LOCK 0 (Disable file lock control)
|
||||
<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>図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 +199,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>
|
||||
</div>
|
||||
|
||||
<div class="para" id="critical">
|
||||
<div class="para doc" id="critical">
|
||||
<h3>クリチカル セクション</h3>
|
||||
<p>ストレージ上のFAT構造を操作している途中で、停電、不正なメディアの取り外し、回復不能なデータ エラー等の障害が発生すると、処理が中途半端な状態で中断され、その結果としてFATボリュームの構造が破壊される可能性があります。次にFatFsモジュールにおけるクリチカル セクションと、その間の障害により起きうるエラーの状態を示します。</p>
|
||||
<div class="lset">
|
||||
@@ -241,10 +225,10 @@ _FS_LOCK 0 (Disable file lock control)
|
||||
<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 +240,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>
|
||||
|
||||
+2
-2
@@ -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><em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。エラー等により再初期化が必要なときは、<tt>f_mount</tt>関数を使用してください。</em>FatFsモジュールは、自動マウント動作により、必要に応じてこの関数を呼び出します。</p>
|
||||
</div>
|
||||
|
||||
<p class="foot"><a href="../00index_j.html">戻る</a></p>
|
||||
|
||||
+5
-5
@@ -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>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 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>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>
|
||||
|
||||
+4
-4
@@ -28,7 +28,7 @@ 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>
|
||||
@@ -56,12 +56,12 @@ DRESULT disk_read (
|
||||
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p>ストレージ デバイスに対するデータの読み書きは、セクタ単位で行われます。FatFsでは512~4096バイトのセクタ サイズをサポートします。固定セクタ サイズ構成(<tt>_MIN_SS == MAX_SS</tt>)のときは、暗黙的にそのセクタ サイズで動作しなければなりません。可変セクタ サイズ構成(<tt>_MIN_SS < MAX_SS</tt>)</p>のときは、初期化後<tt>disk_ioctl()</tt>でセクタ サイズを問い合わせてくるので、それに対して正しい値を返す必要があります。</t>
|
||||
<p>ストレージ デバイスに対するデータの読み書きは、セクタ単位で行われます。FatFsでは512~4096バイトのセクタ サイズをサポートします。固定セクタ サイズ構成(<tt>_MIN_SS == MAX_SS</tt>)のときは、暗黙的にそのセクタ サイズで動作しなければなりません。可変セクタ サイズ構成(<tt>_MIN_SS < 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, &br)</tt>において、<tt>(((UINT)buff & 3) == (f_tell(fp) & 3))</tt>を満足させる - <tt class="arg">buff</tt>のワード アライメントが保証される</li>
|
||||
<li>全ての<tt>f_read</tt>関数において、セクタ全体を含む転送を避ける - 直接転送が発生しない</li>
|
||||
<li><tt>f_read(fp, buff, btr, &br)</tt>関数において、<tt>(((UINT)buff & 3) == (f_tell(fp) & 3))</tt>を満足させる - <tt class="arg">buff</tt>のワード アライメントが保証される</li>
|
||||
</ul>
|
||||
<p>一般的に、複数セクタの転送要求は、ストレージ デバイスに対して可能な限りマルチ セクタ転送しなければなりません。複数のシングル セクタ読み出しに分解された場合、スループットが低下することがあります。</p>
|
||||
</div>
|
||||
|
||||
+1
-1
@@ -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>
|
||||
|
||||
+3
-3
@@ -28,7 +28,7 @@ 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>
|
||||
@@ -58,9 +58,9 @@ DRESULT disk_write (
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
+1
-1
@@ -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>
|
||||
|
||||
+1
-1
@@ -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>
|
||||
|
||||
+14
-9
@@ -11,14 +11,14 @@
|
||||
|
||||
<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 > 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指向なカレント ディレクトリという概念は無く、またドット ディレクトリ("."や"..")は使用できません。パス名先頭のセパレータは無視されます。デフォルト ドライブ番号は常に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>_FS_RPATH == 0</tt>)のときは、全てのオブジェクトがルート ディレクトリから辿る絶対パスで指定されます。OS指向なカレント ディレクトリという概念は無く、またドット ディレクトリ(<tt>"."</tt>や<tt>".."</tt>)は使用できません。パス名先頭のセパレータは無視されます。デフォルト ドライブ番号は常に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>
|
||||
<table class="lst2">
|
||||
<tr><td>パス名の例</td><td>_FS_RPATH == 0</td><td>_FS_RPATH == 1</td></tr>
|
||||
<tr class="lst3"><td>file.txt</td><td>ドライブ0のルート ディレクトリ下のファイル</td><td>カレント ドライブのカレント ディレクトリ下のファイル</td></tr>
|
||||
@@ -36,10 +36,16 @@
|
||||
<p>また、<tt>_STR_VOLUME_ID</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>0~9 A~Z ! # $ % & ' ( ) - @ ^ _ ` { } ~</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>_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>
|
||||
<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,8 +53,7 @@
|
||||
</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>
|
||||
|
||||
@@ -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->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><tt>"*."</tt>のようにピリオドで終わるパターンは、どの名前にもマッチしない。(標準システムでは拡張子無しの名前にマッチ)</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 <= 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 = sizeof lfn;
|
||||
<span class="k">#endif</span>
|
||||
|
||||
fr = f_findfirst(&dj, &fno, "", "dsc*.jpg"); <span class="c">/* "dsc"で始まるJPEGファイルを検索 */</span>
|
||||
|
||||
while (fr == FR_OK && 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(&dj, &fno); <span class="c">/* 次を検索 */</span>
|
||||
}
|
||||
f_closedir(&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>
|
||||
@@ -0,0 +1,69 @@
|
||||
<!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#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>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="para desc">
|
||||
<h4>解説</h4>
|
||||
<p>次に名前のマッチするディレクトリ項目を検索し、見つかった項目をファイル情報構造体にストアします。名前のマッチする項目が見つからずディレクトリの最後まで達した場合は、<tt>fno->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 <= 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>
|
||||
+1
-1
@@ -114,7 +114,7 @@ FRESULT play_file (
|
||||
if (rc) return rc;
|
||||
|
||||
<span class="c">/* 全てのデータが転送されるかエラーが発生するまで続ける */</span>
|
||||
while (rc == FR_OK && fil.fptr < fil.fsize) {
|
||||
while (rc == FR_OK && !f_eof(&fil)) {
|
||||
|
||||
<span class="c">/* ほかの処理... */</span>
|
||||
|
||||
|
||||
+2
-2
@@ -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>
|
||||
|
||||
|
||||
|
||||
+3
-3
@@ -49,13 +49,13 @@ 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><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>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -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>
|
||||
|
||||
|
||||
|
||||
+9
-10
@@ -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>)によって特定の区画(1~4)に結び付けられている場合は、その区画の中にFATボリュームが作成されます。<tt class="arg">sfd</tt>は無視され、また対応する物理ドライブはこれに先立ち、<tt>f_fdisk()</tt>または他のツールで適切に区画設定されている必要があります。</p>
|
||||
<p>物理ドライブ上にFATボリュームを作成(フォーマット)します。FDISK形式が指定された場合は、物理ドライブ全体を占める基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。SFD形式では、FATボリュームが物理ドライブの先頭セクタからベタで作成されます。</p>
|
||||
<p>マルチ パーテーション機能(<tt>_MULTI_PARTITION</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>
|
||||
@@ -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(&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(&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(&fil, "Hello, World!\r\n", 15, &bw);
|
||||
if (bw != 15) ...
|
||||
|
||||
<span class="c">/* Close the file */</span>
|
||||
f_close(&fil);
|
||||
f_close(&fil);
|
||||
|
||||
<span class="c">/* Unregister work area */</span>
|
||||
f_mount(0, "", 0);
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
+2
-2
@@ -58,11 +58,11 @@ FRESULT f_mount (
|
||||
</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>disk_status</tt>関数に反映されない)ときは、アプリケーションはメディア交換の後この関数でファイル システム オブジェクトを明示的にクリアし、マウント動作が正常に行えるようにする必要があります。</p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
+3
-3
@@ -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>
|
||||
|
||||
|
||||
|
||||
+2
-3
@@ -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>
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -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>
|
||||
|
||||
|
||||
+2
-2
@@ -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>
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -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>
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -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>
|
||||
@@ -57,7 +57,7 @@
|
||||
<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>
|
||||
|
||||
+4
-4
@@ -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>
|
||||
@@ -49,15 +49,15 @@ 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 >= 1</tt>)にのみ出力に現れます。</p>
|
||||
<p>ディレクトリの項目(ファイルとディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fno->fname[]</tt>にヌル文字列が返されます。<tt class="arg">fno</tt>にヌル ポインタを指定すると、そのディレクトリのリード インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。</p>
|
||||
<p>ドット エントリ(<tt>"."</tt>と<tt>".."</tt>)は、相対パスが有効なとき(<tt>_FS_RPATH >= 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>
|
||||
<ul>
|
||||
<li>ディレクトリ項目にLFN情報が存在しない。</li>
|
||||
<li>LFNの長さに対してLFN格納バッファまたはLFN操作バッファのサイズが不十分。</li>
|
||||
<li>LFNに現在のOEMコードに存在しない文字が含まれている。(非Unicode構成のとき)</li>
|
||||
</ul>
|
||||
<p>また、ディレクトリ項目にLFN情報が存在しない場合は、<tt>fname[]</tt>に英小文字が含まれる場合があります。</p>
|
||||
<p>また、そのディレクトリ項目にLFN情報が存在しない場合は、<tt>fname[]</tt>に英小文字が含まれる場合があります。</p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -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>
|
||||
|
||||
|
||||
|
||||
+6
-3
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
+6
-6
@@ -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>
|
||||
|
||||
+3
-3
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
+1
-1
@@ -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>
|
||||
|
||||
+2
-2
@@ -45,8 +45,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>
|
||||
|
||||
|
||||
|
||||
+4
-5
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user