2016-04-12

ファイルネームの列挙

最近将棋の記事ばっかだなおいって言われたので、たまにはプログラムの話でも。

あるフォルダにある画像を全て読み込みたいなんてときもあるかもしれません。そういう時は、まずそのフォルダにあるファイルの名前を全て取得してしまえばいい。あとはそれらのファイル名をもとに、画像読み込み関数に回せば完了します。

で、じゃぁファイル名の取得はどうやるのかという話になりますが

void FileNameListUP(const char* dir, std::vector *listhandle, const char* ex){
 //まず、検索ハンドルを新しく用意する
 HANDLE handle;
 WIN32_FIND_DATA finddata;
 std::string t_char = "*.";
 t_char += ex;

 //カレントディレクトリを変更する
 SetCurrentDirectory(GetMainDirectory());
 SetCurrentDirectory(t_dir);

 //ハンドルを作る
 handle = FindFirstFile(t_char.c_str(), &finddata);
 if (handle == INVALID_HANDLE_VALUE){
  FindClose(handle);
  MessageBox(NULL,"拡張子が見つかりません","",MB_OK);
  return;
 }

 //渡されたリストにファイル名を登録していく
 std::string* p_filename;
 while (TRUE){
  p_filename = new std::string;
  *p_filename = finddata.cFileName;
  listhandle->push_back(p_filename);
  if (!FindNextFile(handle, &finddata)){
   if (GetLastError() == ERROR_NO_MORE_FILES){
    break; // 列挙終了
   }
   else{
    break; // エラー
   }
  }
 }
 FindClose(handle);
 return;
}

私はこういうやり方をしているようです。
もう、大分前に作ったものなので、細かいところは忘れてしまいました。
とりあえずどこか別なところから

std::vector< std::string* > filenamelist;
FilenameListUp("data\\graph",&filenamelist,"png");

という感じで呼び出すと、filenamelistにdata\\graphフォルダ内の全てのpngファイルのファイルネームが登録されます。
jpgを登録したいときはpngの部分をjpgに書き換えて呼び出したりします。拡張子を指定しないで登録することもできます。その場合は拡張子を*で呼び出すんだったような気がします。やったことないので忘れてしまいましたが。

途中SetCurrentDirectoryという関数を呼び出しています。これも詳しくは忘れてしまっているんですが、Windowsのフォルダを操作する関数を呼び出すと、その操作したフォルダが勝手にカレントディレクトリになってしまいます。
よって一度data\\graphでフォルダ操作をした後、もう一度data\\graphで操作しようとすると、一回目から見るとdata\\graph\\data\\graphフォルダにアクセスしようとしていることになります。これを回避する方法はいくつかあったような気がするんですが、私はフォルダ操作関数内部でカレントディレクトリを初期状態に戻すことで対処しました。

フォルダ内にある顔画像を全部読み込んでおいて、後でランダムで引っ張り出すときなんかにこういうのを使いはじめました。
最近では、画像のハンドルとファイルネームを結び付けておいて、後でファイルネームから画像を引っ張り出すような使い方のときも、こういうことをしています。
このやり方は使わない画像でもメモリに読み込んでしまうので、使わなくなった画像の削除を忘れたりすると、メモリの無駄になったりします。削除を忘れなければ、とりあえず実害はないと思います。利点としては、同じ画像を別なところで使うような場合に、同じ画像を別なところで読み込まずにすむ分、メモリが節約できるかなという程度です。

コメント

コメントの投稿


管理者にだけ表示を許可する

Copyright (C) 旅の雲. All rights reserved. Template by Underground