Edited at

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

More than 1 year has passed since last update.


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

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

:link: ファイルアーカイブ (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));
}
}


:paperclips: 関連記事

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