前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

15.3. ディレクトリを操作するためのクラス

SFXDirectory クラスは、 ディレクトリの作成や削除、ディレクトリ情報の取得、 ディレクトリ内のファイルやディレクトリの巡回、 テンポラリディレクトリの作成などの処理を行うためのクラスです。

[Caution] mif ファイルの設定

mif ファイルの特権レベル設定で「ファイル」の項目をオンにします。

[Note] エラー処理

以下の関数はすべてエラー値(SFCError 型)を返しますが、 エラー処理は省略しています。

例 15.10. ディレクトリの作成

SFXDirectory::Create(SFXPath("/dir1/")); // dir1 を作成する

// dir1 が存在するときに限り dir2 を作成する
SFXDirectory::Create(SFXPath("/dir1/dir2/"));

// dir1 が存在しないときは dir1 を作成し、その後に dir2 を作成する
SFXDirectory::Create(SFXPath("/dir1/dir2/"), true);
[Note] 注意

引数にファイルパスを指定する関数はすべて SFXPath を使います。

参照: ファイルパス操作クラス

例 15.11. ディレクトリの削除

// dir1 の中が空の場合、dir1 を削除する
SFXDirectory::Remove(SFXPath("/dir1/"));

// dir1 を再帰的にすべて削除する
SFXDirectory::Remove(SFXPath("/dir1/"), false);

例 15.12. ディレクトリの存在判定

Bool b;

// Exists 関数の戻り値は SFCError 型
// b: Exists 関数によりディレクトリが存在するか否か設定される
SFXDirectory::Exists(SFXPath("/dir1/"), &b);

if (b) {
    // ディレクトリが存在する場合

}

例 15.13. ディレクトリ作成日時の取得

SFXDate date; // 日付クラス

// date: ディレクトリの作成日時が設定される
SFXDirectory::GetCreateDate(SFXPath("/dir1/"), &date);

例 15.14. ファイルシステムの総容量と空き容量の取得

UInt32 total_space;
UInt32 free_space;

SFXDirectory::DeviceTotalSpace(&total_space); // total_space: ファイルシステムの総容量が設定される
SFXDirectory::DeviceFreeSpace(&free_space);   // free_space: ファイルシステムの空き容量が設定される

例 15.15. ディレクトリが読み込み専用か判定

Bool b;

// IsReadOnly 関数の戻り値は SFCError 型
// b: IsReadOnly 関数によりディレクトリが読み込み専用であるか否か設定される
SFXDirectory::IsReadOnly(SFXPath("/dir1/data.txt"), &b);

if (b) {
    // ディレクトリが読み込み専用の場合

}

例 15.16. テンポラリディレクトリパスの取得

SFXPath path;
SFXPath parentPath;
SFCError error;

path.Set(SFXAnsiString("/"));

if ((error = SFXDirectory::GetTemporaryPath(parentPath, &path)) == SFERR_NO_ERROR) {

    // path: "/sfx7182CBD4dir/" のようなディレクトリパスが設定される
    ...
}
[Note] 注意

一時的なディレクトリを作成するとき、既存のものと重複しないディレクトリパスを取得します。

例 15.17. 一意なディレクトリパスの取得

SFXPath path;
SFXPath parentPath;
SFCError error;

path.Set(SFXAnsiString("/"));

if ((error = SFXDirectory::GetUniquePath(parentPath, "data", "x", &path)) == SFERR_NO_ERROR) {

    // path: "/data7182CBD4x/" のようなディレクトリパスが設定される
    ...
}
[Note] 注意

既存のものと重複しないディレクトリパスを取得します。

ディレクトリ内のファイルを列挙するには、ファイル列挙子を使います。

例 15.18. ディレクトリ内ファイルの列挙

SFXPath path;
SFXDirectory::Enumerator etor;  // 列挙子

// ファイル列挙子を取得する
SFXDirectory::GetFileEnumerator(SFXPath("/dir1/"), &etor);

// ファイルを列挙する
while (etor.HasNext()) {
    path = etor.GetNext();                       // "/dir1" 内のファイルパスを取得する
    TRACE("file = %s", path.Get().GetCString()); // ファイルパスを表示する
}

ディレクトリ内のサブディレクトリを列挙するには、ディレクトリ列挙子を使います。

例 15.19. ディレクトリ内サブディレクトリの列挙

SFXPath path;
SFXDirectory::Enumerator etor;  // 列挙子

// ディレクトリ列挙子を取得する
SFXDirectory::GetDirectoryEnumerator(SFXPath("/dir1/"), &etor);

// サブディレクトリを列挙する
while (etor.HasNext()) {
    path = etor.GetNext();                      // "/dir1" 内のファイルパスを取得する
    TRACE("dir = %s", path.Get().GetCString()); // ディレクトリパスを表示する
}

ディレクトリ内に含まれるすべてのファイルとサブディレクトリを再帰的に列挙するには、 以下のような再帰関数を定義します。

例 15.20. ディレクトリ内のすべてのファイルとサブディレクトリの再帰的な列挙

Void EnumerateDirectory(SFXPath path)
{
    SFXDirectory::Enumerator etor;

    // ファイル列挙子を取得する
    SFXDirectory::GetFileEnumerator(path, &etor);

    while (etor.HasNext()) { // 各ファイルについて

        SFXPath filepath = etor.GetNext();
        TRACE("file = %s", filepath.Get().GetCString()); // ファイルパスを表示する
    }

    // ディレクトリ列挙子を取得する
    SFXDirectory::GetDirectoryEnumerator(path, &etor);

    while (etor.HasNext()) { // 各サブディレクトリについて

        SFXPath dirpath = etor.GetNext();
        TRACE("dir = %s", dirpath.Get().GetCString()); // ディレクトリパスを表示する
        EnumerateDirectory(dirpath);
    }
}

例 15.21. EnumerateDirectory 関数の使い方

EnumerateDirectory(SFXPath("/dir1/"));  // dir1 以下のすべてのファイル、ディレクトリを列挙する