C# DirectoryInfo.GetFilesについて

   

たまたま、「DirectoryInfo.GetFilesで想定しないファイルが取得されることがある」ということから
調査・実験をしてみました。

DirectoryInfo.GetFiles()
DirectoryInfoで取得したディレクトリ内のファイルの一覧を取得できるものです。
引数なしと引数ありのメソッドがあり、引数ありは条件指定ができるものです。

 

試してみる

下記のようなコードで小さなコマンドを作りました。

 

単純に、カレントディレクトリ内のファイル一覧を引数で渡した条件で取得するだけのものです。

 

動かしてみる

試しに、C:\work\testというフォルダに、あらかじめ

aaa.xls
aaa.xlsx

という新旧2つのエクセルファイルをおいて今回作成したコマンドを実行してみました。

 

‘*’は、0文字以上任意の長さの文字です。

なぜか、aaa.xlsxがヒットしてる(これが今回の「DirectoryInfo.GetFilesで想定しないファイルが取得されることがある」現象です)。

 

‘?’は、任意の1文字です。
今回はどちらもファイル名の長さは同じなので3文字にしました。

aaa.xlsxはヒットしません。

試しに、Dドライブで同じことをやってみました。
(2つのエクセルファイルも置いています)

 

aaa.xlsxはヒットしません。

 

‘?’でやっても結果は同じでした。

この現象は、「Cドライブだから・・・」というものではありません。

 

ほんとの理由

この現象が発生する理由を知る一番手軽な方法は、dirコマンドで’dir /X’とすると判ります。

CドライブとDドライブでちょっと違うところがありますね。

 

このdirコマンドのオプション’/X’の意味は、下記のとおりです。

 

そう、この8.3形式のファイル名が原因だったんです。
DirectoryInfo.GetFilesでは8.3形式のファイル名も検索の対象になっているようです。

Cドライブで”???.xls”を条件にしたときにaaa.xlsxがヒットしなかったのは拡張子が違ったからではなく、「ファイル名が3文字ではなかった」からです。

DirectoryInfo.GetFilesを使うときはこのあたりの動作も気を付けてください。

 

8.3形式の短いファイル名を生成しないようにするには、下記のリンクをどうぞ

@IT 8.3形式の短いファイル名を生成しないようにする

 

 

 - 未分類