Siv3D のファイルアーカイブ機能まとめ


Siv3D のファイルアーカイブ機能とは

画像ファイルや音声ファイル、テキストファイルなどプログラムから使う外部データをひとつのファイルにまとめることができます。

ファイルアーカイブ (Siv3D/Reference-JP Wiki)

アーカイブの作成

Archive::Create() を使用します。

サンプルコード

// Example フォルダの内容をアーカイブファイル Example.s3a にまとめる
Archive::Create(L"Example", L"Example.s3a");

アーカイブ内のテキストファイルを読み込む

TextReader、CSVReader、INIReader、XMLReader を使用できます。
リファレンスによると、読み込み可能なテキストファイルのエンコーディングは以下に限られています。

テキストファイルは UTF-8 / UTF16-LE / UTF16-BE 形式をサポートしています。

サンプルコード

FileArchive archive(L"Example.s3a");

// テキストファイルを読み込む
const String text = TextReader(archive.load(L"Example/Test.txt").readAll());

// CSVファイルを読み込む
CSVReader csv(archive.load(L"Example/Test.csv"));

アーカイブ内の画像ファイルを読み込む

Image または Texture クラスのコンストラクタに load 関数の戻り値 (ArchivedFileReader) を渡します。
TextureAsset を使用する場合は、TextureAssetData::FromFileArchive() を使用します。

サンプルコード

FileArchive archive(L"Example.s3a");

// Texture を使用する場合
const Texture texture(archive.load(L"Example/Windmill.png"));

// TextureAsset を使用する場合
TextureAsset::Register(L"windmill", TextureAssetData::FromFileArchive(L"Example.s3a", L"Example/Windmill.png"));

アーカイブ内の音声ファイルを読み込む

Sound または Wave クラスのコンストラクタに load 関数の戻り値 (ArchivedFileReader) を渡します。
SoundAsset を使用する場合は、SoundAssetData::FromFileArchive() を使用します。

サンプルコード

FileArchive archive(L"Example.s3a");

// Sound を使用する場合
const Sound sound(archive.load(L"Example/Sound.mp3"));

// SoundAsset を使用する場合
SoundAsset::Register(L"snd", TextureAssetData::FromFileArchive(L"Example.s3a", L"Example/Sound.mp3"));

アーカイブ内のフォントを使用する

FontManager::Register() を使用します。

サンプルコード

FileArchive archive(L"Example.s3a");

FontManager::Register(archive.load(L"Example/YomogiFont.ttf"));

const Font font(24, L"よもぎフォント");

その他のフォーマットのファイルを読み込む

公式リファレンスより:

その他の形式は FileArchive::load() が返す ArchivedFileReader からバイナリデータを読み込む必要があります。

サンプルコード

FileArchive archive(L"Example.s3a");

ArchivedFileReader reader = archive.load(L"Example/Test.txt"); //特に意味なくバイナリ読み込みしてみる

// ファイルサイズ
Println(reader.size());

// 先頭から10バイト分読んでみる
Array<uint8> buffer(10);
reader.read(buffer.data(), 10);

for (auto c : buffer)
{
    Println((wchar)i);
}

小ネタ : アーカイブ内の画像ファイルをまとめてアセット登録

サンプルコード

FileArchive archive(L"Example.s3a");

for (auto path : archive.contents())
{
    if (path.endsWith(L".png") || path.endsWith(L".jpg"))
    {
        TextureAsset::Register(FileSystem::BaseName(path), TextureAssetData::FromFileArchive(L"Example.s3a", path));
    }
}

関連記事

Siv3Dでリソースファイルをまとめてexeに埋め込むワークフロー