[C#] System.IO.Directory.GetFilesで余分なファイルまで取得される

投稿


C#でディレクトリ内のファイル名を取得するさい、「System.IO.Directory.GetFiles」staticメソッドがとても便利です。
参考: MSDN: Directory.GetFiles メソッド (String, String, SearchOption) (System.IO) [↗]

public static string[] GetFiles(  // 戻り値はファイル名の配列
  string path,               // 検索するディレクトリのパス
  string searchPattern,      // 検索ファイル名。ワイルドカードOK。"*"で全てのファイルを検索
  SearchOption searchOption  // 検索対象範囲。"SearchOption.AllDirectories"でサブディレクトリも検索
)

 


 
たとえば、”D:\Image”ディレクトリ以下サブディレクトリも含めて全てのファイル名を取得するには、以下のようにします。

// 事前に「using System.IO;」しておくこと
string[] files = Directory.GetFiles(@"D:\Image", "*", SearchOption.AllDirectories);

サブディレクトリ探索のための再帰処理を自分で書かなくてもいいのはとても便利!
 


 
ところが、拡張子を指定してファイル検索すると、余計なものまで取得してしまうことがあります。
以下のように”*.gif”を探そうとすると…

// 事前に「using System.IO;」しておくこと
string[] files = Directory.GetFiles(@"D:\Image", "*.gif", SearchOption.AllDirectories);

なんと、“*.gifv”まで余計に取得してしまいました。
(ちなみにエクスプローラーのファイル検索機能でも、同じような結果になるので、そういう仕様なのかしらん…)
 
 
これを防ぐには、System.IO.Directory.GetFilesでは全てのファイルを取得しておき、
その後、LINQのWhereメソッドで絞込みをするのがいいかと思います。

// 事前に「using System.IO;」「using System.Linq;」しておくこと
string[] files = Directory.GetFiles(@"D:\Image", "*", SearchOption.AllDirectories).
                   Where(s => s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase)).ToArray();

上の例は、Whereメソッドにて、末尾が”.gif”のものを(大文字小文字区別せず)抽出しています。





コメントを残す

メールアドレスが公開されることはありません。