2014/09/08

[C#]LINQで複数条件のファイルを抽出する

このエントリーをはてなブックマークに追加
Directory.GetFilesの引数ではpatternがワイルドカード(*と?)しか使えないので、複数の拡張子を条件に抽出するようなとき、たとえば*.jpg|*.pdf|*.epsというような書き方ができません。

複数条件のファイルの抽出

LINQを使うことで簡潔でした。LINQで書く必要はあんまりないかもしれませんが、まあ練習用です。
二つのデータの集合を照合させるという意味としても直接的な気がしてます。
string path = @"C:\Windows\Temp";
string[] patterns = {".jpg",".pdf",".eps"};
string[] files = Directory.GetFiles(path, "*.*");

var ret = files.Where(file => patterns.Any(pattern => file.ToLower().EndsWith(pattern)));
一文で書けました。

使ってるLINQメソッド
Where条件に当てはまるものを抽出
Anyいずれかが条件に当てはまるとtrueを返す

ファイルが条件に適合するかどうかの判定は、下の文です。
file.ToLower().EndsWith(pattern)
この部分を変更することで、正規表現に対応したりいろいろできそうです。

なお、patternsは適合率の高い拡張子を左に置くほうが、先に判定されるので処理効率がいいはずです。

サブフォルダ内のファイルも対象にする

おまけです。サブフォルダ内のファイルも対象にするには、DirectoryのGetFilesメソッドの引数にSearchOption.AllDirectoriesを指定してあげます。
string[] files = Directory.GetFiles(path, "*.*",SearchOption.AllDirectories);

0 件のコメント :

コメントを投稿