2011年12月1日木曜日

( C# )GetFilesによる複数拡張子のファイル取得

※新しい記事に「( C# )フォルダ以下の特定の拡張子のファイルをすべて取得する」を追加してあります。こちらを見たほうが楽かもしれません。

今日はC#
 複数拡張子フィルタリングによるファイル取得は
ただ単にGetFiles(path, searchpattern);を繰り返して、後で配列を結合させればできるのだが、キャッシュに入るので速度は速いらしいが何度も書くのは何か気持ちが悪い。
他の方法が無いか探してみると一応あるにはあった。linqを使う方法である。

Regex regex = new Regex(@".*\.jpg|.*\.JPG|.*\.Jpg");
IEnumerable<string> files = null;
files = from file in Directory.GetFiles(currentDir) where regex.IsMatch(file) select file;

これでコードはスッキリするのだが、速度が遅すぎて使い物にならない。正規表現が足を引っ張っているようだ。
そこで少し改良して以下のようにした。

Func<string, bool> func = new Func<string, bool>(where);
IEnumerable<string> file_temp = null;
IEnumerable<string> files = null;
file_temp = Directory.GetFiles(currentDir);
files = Enumerable.Where<string>(file_temp, func);
/*... 省略  ...*/
public bool where(string name)
{
     string temp_name3 = null;
     try
     {
         temp_name3 = name.Remove(0, name.Length - 4);
         temp_name3 = temp_name3.ToLower();
         if (temp_name3.Equals(".jpg") || temp_name3.Equals(".tif") || temp_name3.Equals(".bmp"))
         {
              return true;
         }
         string temp_name4 = name.Remove(0, name.Length - 5);
         temp_name4 = temp_name4.ToLower();
         if (temp_name4.Equals(".jpeg") || temp_name4.Equals(".tiff"))
         {
              return true;
          }
      }
      catch
      {
              return false;
      }
      return false;
}

これでかなりマシな速度になった。最速ではないのだろうが、まぁ許容範囲であろう。一応メモ。