LoginSignup
24
19

More than 5 years have passed since last update.

DirectoryInfo.GetFiles の罠

Last updated at Posted at 2015-08-10

C:\hoge に存在する拡張子が.txtのファイル一覧がほしい場合、

C#
DirectoryInfo di = new DirectoryInfo(@"C:\hoge");
FileInfo[] fi = di.GetFiles(@"*.txt");
VB
Dim di As New DirectoryInfo("C:\hoge")
Dim fi() As FileInfo = di.GetFiles("*.txt")

こんなコードを書いておりました。
が、この書き方だと.txt 以外のファイルも引っかかります。
例えば、.txt_ みたいな拡張子のファイルも対象になってしまいます。

この動きは.NET Framework 2.0 からの仕様のようで……。

DirectoryInfo.GetFiles メソッド (String)

メモ
searchPattern でアスタリスクのワイルドカード文字を使用した場合 ("*.txt"など)、指定された拡張子の長さによって、一致の仕方が変わります。 searchPattern にちょうど 3 文字の拡張子が指定されていると、searchPattern に指定されている拡張子と最初の 3 文字が一致していて、3 文字以上の拡張子を持つファイルが返されます。 searchPattern に 1 文字、2 文字、または 4 文字以上の拡張子が指定されていると、searchPattern に指定されている拡張子と一致していて、それと同じ長さの拡張子を持つファイルのみが返されます。 疑問符のワイルドカード文字を使用した場合、このメソッドは、指定された拡張子と一致するファイルのみを返します。 たとえば、ディレクトリ内に "file1.txt" と "file1.txtother" という 2 つのファイルが存在する場合、"file?.txt" という検索パターンでは 1 つ目のファイルのみが返されますが、"file*.txt" の検索パターンでは両方のファイルが返されます。

アスタリスク&拡張子3文字の場合は気をつけましょうね、ということでした。←まんまと引っかかった人

なお、.NET Framework 4 から追加された EnumerateFiles でもこの辺の挙動は変わらないようです。
DirectoryInfo.EnumerateFiles メソッド (String)
MSDNには書いてないけど……。


(2017/02/02 追記)
この挙動は、8.3形式の名前を生成するかどうかに依存するようです。
8.3形式の名前を生成するドライブではここに書かれたような挙動をし、そうでないドライブでは "自然な" 挙動をする、と。
参考:
https://teratail.com/questions/63523

24
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
19