2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

« .NETでファイルを検索するときは、Directory.GetFiles(,検索パターン)を積極的に使うべし。 | トップページ | .NETのDirectory.GetFiles(,検索パターン)の代替関数 »

2008年4月28日 (月)

.NETのDirectory.GetFiles(,検索パターン)のワイルドカードの誤動作に注意すべし。

*1.* や *2.* などは、長いファイル名にも、よくマッチします。
*.xls は、*.xlsx や *.xlsm などにもマッチします。つまり、*.xls* みたい。正確には違いますが。

このことはヘルプにも一部書いてあります。
Directory.GetFiles メソッド (String, String) (System.IO)
http://msdn2.microsoft.com/ja-jp/library/wz42302f(VS.80,printer).aspx

短いファイル名にマッチすると、長いファイル名を返す。のが仕様のようです。というか、そもそも、それが、FindFirstFile() APIの仕様です。
GetShortPathName
http://msdn.microsoft.com/library/ja/jpfileio/html/_win32_getshortpathname.asp?frame=true

なので、自分で再度、検索パターンでフィルタリングする必要があります。
If Path.GetFileName(パス) Like 検索パターン Then

かと言って、Directory.GetFiles(,検索パターン)を使わず、全件検索して最初から自分で検索パターンでフィルタリングするのは、遅いのでやめましょう。
面倒でも、二重にフィルタリングしましょう。

ただし、GetFiles(,検索パターン1) と Like 検索パターン2 でシンタクスが少し違うので、
検索パターン2=Replace(Replace(検索パターン1,"[","[[]"),"#","[#]")
でエスケープする必要があります。

« .NETでファイルを検索するときは、Directory.GetFiles(,検索パターン)を積極的に使うべし。 | トップページ | .NETのDirectory.GetFiles(,検索パターン)の代替関数 »