ビルド後にStreamingAssets内にある、指定ディレクトリのファイル一括取得がうまくいかなかったのでメモ。
StreamingAssetsについてはこちら
うまくいかなかった内容は、開発環境で絶対パスでファイルを取得していたが、ビルド後は相対パスに書き変わってしまっていたのでファイル取得が失敗してしまっていた。
動作環境
Windows10
Unity 2018.2.6f1
失敗例 : StreamingAssets内の指定ディレクトリのファイルリストの取得
sampleディレクトリ内のpng画像を一括取得
string [] files = System.IO.Directory.GetFiles (Application.streamingAssetsPath + "/sample", "*.png"
, System.IO.SearchOption.TopDirectoryOnly);
/// 又は
DirectoryInfo dir = new DirectoryInfo(Application.streamingAssetsPath + "/sample");
FileInfo[] files = dir.GetFiles("*.png");
上記の場合だと、開発時は絶対パスのファイルリストを返すが、
ビルド後、相対パスのファイルパスを返すのでファイルの取得に失敗してしまう。
なので、ビルド前、ビルド後の環境に依存しないようにファイルパスを取得できるように、
メソッドを用意する必要があった。
環境に依存しない、StreamingAssets配下のファイルリストを取得するメソッド
/// @method GetStreamingAssetFiles
/// @param string dir StreamingAssets配下にある取得したいディレクトリパス
/// @param string ext 取得したいファイル拡張子 (例: *.png, *.mp4, *.ogg, *.* 等)
/// @param bool isFullPath ファイルパスをフルパスで取得するか(デフォルトはフルパス)
static public string[] GetStreamingAssetFiles(string dir, string ext, bool isFullPath = true)
{
if (dir.IndexOf("/") != 0)
{
dir = "/" + dir;
}
if (dir.LastIndexOf("/") != dir.Length - 1)
{
dir = dir + "/";
}
string basePath = Application.streamingAssetsPath + dir;
string[] files = System.IO.Directory.GetFiles(basePath, ext, System.IO.SearchOption.TopDirectoryOnly);
if (isFullPath && -1 == files[0].IndexOf(basePath))
{
for (int i = 0; i < files.Length; i++)
{
files[i] = basePath + files[i];
}
}
else if (!isFullPath && -1 < files[0].IndexOf(basePath))
{
for (int i = 0; i < files.Length; i++)
{
files[i] = files[i].Replace(basePath, "");
}
}
return files;
}
使用例
sampleディレクトリ内のpng画像を一括取得
// ファイルリストの取得
string [] files = GetStreamingAssetFiles("sample", "*.png");
// リスト一覧
for (int i = 0; i < files.Length; i++)
{
files[i] = files[i].Replace(basePath, "");
Debug.Log(files[i]);
// C:/App/Assets/StreamingAssets/sample/hoge.png
}
これでひとまず、無事フルパスでファイルリストが取得することができました。