# FS_HasEnoughSpaceToCreateFile

## 構文

    #include <nitro/fs.h>

    BOOL FS_HasEnoughSpaceToCreateFile(FSArchiveResource *resource, const char *path, u32 size);

## 引数

resource | 事前にFS_GetArchiveResource関数で取得したアーカイブ情報
path | 生成したいファイルのパス名 ディレクトリの生成判定なら終端に"/"を付与する必要があります。 空文字列""を指定した場合、ファイルが既存であるとみなしてパス名の判定を省略します。
size | 生成したいファイルのサイズ ディレクトリの生成判定なら0を指定します。

## 返り値

指定したパス名とサイズを持つファイルが確実に生成可能であればTRUEを、失敗すればFALSEを返します。

## 説明

指定したパス名とサイズを持つファイルが確実に生成可能かどうか、空き容量から理論値を計算して判定します。
この関数は、NANDアーカイブや SDカードアーカイブなどのFAT構造を持つメディアが内部で消費するクラスタ数なども考慮した上で、 実際に必要とされる論理的な所要サイズを算出します。 パスに含まれる各々のディレクトリ階層が実際に存在するかどうかに関わらず常に1クラスタずつ消費するものとみなして計算します。

この関数はドライブの実際の内部状態を確認することなしに確実に生成可能かどうかをすみやかに判定することが目的であるため、 実際にはファイルが作成可能なケースであっても計算上100%成功するといえない状況ではFALSEを返す可能性があるという点に注意してください。 時間をかけてでもなるべく厳密な判定結果を得たいという場合には、`FS_GetPathInfo( )` などの関数を併用して既存ディレクトリのサイズ判定を省略してもかまいません。

NANDアプリのセーブデータサイズを決定する際には、別途「セーブデータサイズ一覧」の情報もご参考ください。

この関数に引数として与えるアーカイブ情報は事前に`FS_GetArchiveResource()`を呼び出して取得しておく必要があります。
この関数を呼び出してTRUEが返った場合、パス名とファイルサイズに応じて消費するであろうディスク容量がアーカイブ情報に反映され、availableSizeメンバとavailableClustersメンバが減少します。このアーカイブ情報を再び使用してこの関数を繰り返し呼び出すことによって、複数のファイルが全て生成可能かどうかも同様に判定することができます。
使用例を以下に示します。

`
// まず現在のアーカイブ情報を取得。
FSArchiveResource resource[1];
if (FS_GetArchiveResource("sdmc:/", resource))
{
// 生成したいファイルのパス名とサイズを個別に判定。
BOOL enough = TRUE;
enough &= FS_HasEnoughSpaceToCreateFile(resource, "sdmc:/foo/file1.txt", 1000);
enough &= FS_HasEnoughSpaceToCreateFile(resource, "sdmc:/bar/file2.txt", 10000);
if (enough)
{
// すべて成功ならば指定した全てのファイルを生成できる充分な容量が存在している。
}
}
return retval;
`

この関数はアーカイブへ実際にアクセスすることなしに論理的に充分なサイズをただちに算出します。 そのため、実際には同じディレクトリを指しているようなパスを何回も指定した場合、 そのディレクトリを生成するのに必要な消費サイズを何回も重複してカウントしてしまうことになります。 ディレクトリは1階層ごとに1クラスタ分の容量を消費するため、 指定するパスの階層が深ければこの重複サイズは非常に大きな値になってしまいます。
このような誤差を避けるには、パスの共通部分をまとめて1回だけ呼び出すようにします。
使用例を以下に示します。

`
// 以下のような指定では"sdmc:/foo/bar/"の生成に必要なサイズを何度もカウントしてしまいます。
// enough &= FS_HasEnoughSpaceToCreateFile(resource, "sdmc:/foo/bar/file1.txt", 1000);
// enough &= FS_HasEnoughSpaceToCreateFile(resource, "sdmc:/foo/bar/file2.txt", 10000);
// enough &= FS_HasEnoughSpaceToCreateFile(resource, "sdmc:/foo/bar/file3.txt", 10);
// サイズ計算の重複を避けるため、まず共通のディレクトリ部分について1回テストします。
enough &= FS_HasEnoughSpaceToCreateFile(resource, "sdmc:/foo/bar/", 0);
// これ以降、"sdmc:/foo/bar/"は存在するものとみなして省略できます。
enough &= FS_HasEnoughSpaceToCreateFile(resource, "file1.txt", 1000);
enough &= FS_HasEnoughSpaceToCreateFile(resource, "file2.txt", 10000);
enough &= FS_HasEnoughSpaceToCreateFile(resource, "file3.txt", 10);
`

## 参照

`セーブデータサイズ一覧
FSArchiveResource FS_GetArchiveResource`

## 履歴

2009/02/12 レイアウトを微調整。
2009/01/13 説明に若干の補足を追記。「セーブデータサイズ一覧」へのリンクを追加。
2008/12/12 返り値が厳密なものでない旨と代替手段の例を追記。
2008/09/16 消費サイズ計算の重複を避けるための説明と例を追加。
2008/02/21 `FSArchiveResource` を呼び出し側で用意するように仕様変更。
2008/01/24 初版