任意のディレクトリのすべてのファイルの読み込み方法
まいまい  2016/10/12(Wed) 15:50
あるディレクトリのファイルすべてを順次読み込んでくれるような処理をしたいと思っています.
そのディレクトリにあるファイルは全て同じ拡張子です.
そのディレクトリにあるファイル数は未定だとします.
FindNextFile()関数のような機能はありますでしょうか.
データの初期化に用いたいので,Siv3Dのメインループwhile (System::Update())よりも前に実行したいと考えています.


-------------疑似コード-------------------

const char directory = "c::/user/1";

while(FindNextFile(directory)){ //次のファイルが存在すればループ

/*読み込んだファイルを変数に格納などの処理*/

}
記事編集
Reputeless  2016/10/12(Wed) 23:14
[A] FileSystem::DirectoryContents() を使うと、指定したフォルダにあるファイルとフォルダの一覧を取得できます。

# include <Siv3D.hpp>

void Main()
{
// Example/ フォルダにある PNG ファイル一覧を表示
for (const auto& path : FileSystem::DirectoryContents(L"Example/"))
{
if (FileSystem::Extension(path) == L"png")
{
Println(path);
}
}

WaitKey();
}



[B] 下の階層のフォルダも検索したい場合は再帰的に呼び出します。

# include <Siv3D.hpp>

Array<FilePath> GetFilePaths(const FilePath& directory, bool recursive = true)
{
Array<FilePath> paths;

for (const auto& path : FileSystem::DirectoryContents(directory))
{
if (FileSystem::IsFile(path))
{
paths.push_back(path);
}
else if (recursive)
{
const auto t = GetFilePaths(path, true);
paths.insert(paths.end(), t.begin(), t.end());
}
}

return paths;
}

void Main()
{
// Example/ フォルダにある PNG ファイル一覧を表示(true: 下の階層のフォルダも調べる)
for (const auto& path : GetFilePaths(L"Example/", true))
{
if (FileSystem::Extension(path) == L"png")
{
Println(path);
}
}

WaitKey();
}
編集
まいまい  2016/10/13(Thu) 00:37
ありがとうございます.
ただ,上記の[A]のコードを実行しても,画像が読み込めない事態になってしまいました.
Println(path)は正常に動作します.
かならず,下記のif(!image)の分岐に入ってしまいます.
初歩的な質問かもしれませんが,どうぞご教授よろしくお願いいたします.

--------再現疑似コード-----------


for (const auto& path : FileSystem::DirectoryContents(L"C:/Users/Picture/"))
{
if (FileSystem::Extension(path) == L"jpg")
{
Println(path);

const Image image(path);
if (!image)
{
return;
}

/*画像の画素値を取得する処理等*/
}
}
}
編集
Reputeless  2016/10/13(Thu) 15:23
こちらの環境で再現できません。
Example フォルダの png ファイルに対してはどうかご確認ください。

「かならず,下記のif(!image)の分岐に入ってしまいます.」とは全てのファイルに対してでしょうか。
特定のファイルについてであれば、Dropbox 等でそのままのファイルを共有していただけると、原因究明に役立ちます。
編集
まいまい  2016/10/14(Fri) 17:49
Exampleフォルダの他の画像は正常に読み込みができました.
どうやら私が読み込みたい画像だけが読み込めなかったようです.

フリーの拡張子解析ソフトを使ってみると,jpgだと思っていた拡張子はthmだったことが原因のようです.
そのため,Siv3Dのサポート外だったためImageに読み込めなかったようです.
普段は,OpenCVライブラリで読み込みを行っており,そこでは特にエラーは起きなかったため,拡張子が不適切だったことに気が付きませんでした.

対策としては,OpenCVライブラリを用いてthmファイルを読み込み,その上でjpgファイルとして出力をすることで,問題は解決できました.


ご教授どうもありがとうございました.
編集
Reputeless  2016/10/14(Fri) 19:54
原因を調査いただきありがとうございます。
今後 Siv3D で thm ファイルもサポートできないか調査・検討します。
編集
件名
Re: 任意のディレクトリのすべてのファイルの読み込み方法
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -