MyLib.File.FileSystem
ファイル関連 / ファイルシステムを管理する
所属:mylibのAPI解説 · 全モジュール索引
読み方
このページは実ファイルから生成したソース照合用資料です。公開関数の引数・戻り値の型、オーバーロード、列挙値を確認できます。public/protected/privateを区別し、privateメンバーを呼び出し例に使わないでください。コメントは原文であり、古い説明や誤記を含む場合があります。利用条件・訂正は上記のAPI解説と既知の制約を優先してください。
元ファイル:ProjectName/include/MyLib/FileSystem/FileSystem.ixx。確認基準:08f9fa53。
インターフェースとインライン実装
cpp
module;
#include <Windows.h>
#include <filesystem>
#include <fstream>
export module MyLib.File.FileSystem;
import <unordered_map>;
import <string>;
export import MyLib.File.JsonIO;
export import MyLib.File.CsvIO;
export import MyLib.File.MemMapFile;
namespace fs = std::filesystem;
/// <summary>
/// ファイル関連
/// </summary>
export namespace file
{
/// <summary>
/// ファイルシステムを管理する
/// </summary>
export class FileSystem final
{
public:
/// <summary>
/// コンストラクタ
/// </summary>
FileSystem()
{
// 実行ファイルの場所の初期化
InitExeDir();
// リソースディレクトリの設定
m_resourcesDir = m_exeDir / "resources";
m_dataDir = m_resourcesDir / "data";
m_assetsDir = m_resourcesDir / "assets";
m_shaderDir = m_resourcesDir / "shader";
// 仮想パスをマウント
Mount("exe", m_exeDir);
Mount("resources", m_resourcesDir);
Mount("data", m_dataDir);
Mount("assets", m_assetsDir);
Mount("shader", m_shaderDir);
}
/// <summary>
/// デストラクタ
/// </summary>
~FileSystem() = default;
/// <summary>
/// 実行ファイルの場所の初期化
/// </summary>
void InitExeDir()
{
char buffer[MAX_PATH];
GetModuleFileNameA(nullptr, buffer, MAX_PATH);
m_exeDir = std::filesystem::path(buffer).parent_path();
}
/// <summary>
/// 実行ファイルの場所を取得
/// </summary>
/// <returns>実行ファイルが存在するディレクトリのパス</returns>
fs::path GetExeDir() const { return m_exeDir; }
/// <summary>
/// resources の場所
/// </summary>
fs::path GetResourcesDir() const { return m_resourcesDir; }
/// <summary>
/// データファイルの場所を取得
/// </summary>
fs::path GetDataDir() const { return m_dataDir; }
/// <summary>
/// アセットディレクトリの場所を取得
/// </summary>
fs::path GetAssetsDir() const { return m_assetsDir; }
/// <summary>
/// シェーダーディレクトリの場所を取得
/// </summary>
fs::path GetShaderDir() const { return m_shaderDir; }
/// <summary>
/// 仮想パスのマウント
/// </summary>
void Mount(const std::string& scheme, const fs::path& root)
{
m_mounts[scheme] = fs::weakly_canonical(root);
}
/// <summary>
/// 仮想パスの解決
/// </summary>
fs::path Resolve(std::string_view path) const
{
// スキームの位置を検索
auto pos = path.find("://");
if (pos == std::string_view::npos) {
return fs::path(std::string(path));
}
// スキームとサブパスに分割
std::string scheme{ path.substr(0, pos) };
std::string sub{ path.substr(pos + 3) };
// マウントポイントを探す
auto it = m_mounts.find(scheme);
if (it == m_mounts.end()) {
return fs::path(std::string(path));
}
return it->second / sub;
}
/// <summary>
/// ディレクトリの再帰コピー
/// </summary>
void CopyDir(fs::path from, fs::path to)
{
try
{
fs::copy(from, to,
fs::copy_options::recursive | fs::copy_options::overwrite_existing);
}
catch (const fs::filesystem_error& e)
{
// ログ出力(DxLibなら printfDx とかでもOK)
throw e;
}
}
JsonIO jsonIO; // Json入出力
CsvIO csvIO; // CSV入出力
private:
fs::path m_exeDir; // 実行ファイルディレクトリ
fs::path m_resourcesDir; // resources ディレクトリ
fs::path m_dataDir; // data ディレクトリ(resources 配下)
fs::path m_assetsDir; // assets ディレクトリ(resources 配下)
fs::path m_shaderDir; // shader ディレクトリ(resources 配下)
std::unordered_map<std::string, fs::path> m_mounts; // マウントポイント
};
}