LoginSignup
3
2

More than 5 years have passed since last update.

UnityのStreamingAssets内のファイル一括取得にビルド後、ファイル取得に失敗してしまう

Last updated at Posted at 2018-10-01

ビルド後に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
}

これでひとまず、無事フルパスでファイルリストが取得することができました。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2