たまたま、「DirectoryInfo.GetFilesで想定しないファイルが取得されることがある」ということから
調査・実験をしてみました。
DirectoryInfo.GetFiles()
DirectoryInfoで取得したディレクトリ内のファイルの一覧を取得できるものです。
引数なしと引数ありのメソッドがあり、引数ありは条件指定ができるものです。
試してみる
下記のようなコードで小さなコマンドを作りました。
class Program { static void DispGetFiles(string key) { string dir = Environment.CurrentDirectory; // 現在のディレクトリの情報を取得 System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(dir); // ディレクトリ内のファイル一覧を取得 System.IO.FileInfo[] fi = di.GetFiles(key); foreach(System.IO.FileInfo f in fi) { // ひたすらファイル名を出力 Console.WriteLine(f.FullName); } } static void Main(string[] args) { string key = args[0]; DispGetFiles(key); } }
単純に、カレントディレクトリ内のファイル一覧を引数で渡した条件で取得するだけのものです。
動かしてみる
試しに、C:\work\testというフォルダに、あらかじめ
aaa.xls
aaa.xlsx
という新旧2つのエクセルファイルをおいて今回作成したコマンドを実行してみました。
C:\work\test>CheckGetFiles *.xls C:\work\test\aaa.xls C:\work\test\aaa.xlsx
‘*’は、0文字以上任意の長さの文字です。
なぜか、aaa.xlsxがヒットしてる(これが今回の「DirectoryInfo.GetFilesで想定しないファイルが取得されることがある」現象です)。
C:\work\test>CheckGetFiles ???.xls C:\work\test\aaa.xls
‘?’は、任意の1文字です。
今回はどちらもファイル名の長さは同じなので3文字にしました。
aaa.xlsxはヒットしません。
試しに、Dドライブで同じことをやってみました。
(2つのエクセルファイルも置いています)
D:\work\test>CheckGetFiles *.xls D:\work\test\aaa.xls
aaa.xlsxはヒットしません。
D:\work\test>CheckGetFiles ???.xls D:\work\test\aaa.xls
‘?’でやっても結果は同じでした。
この現象は、「Cドライブだから・・・」というものではありません。
ほんとの理由
この現象が発生する理由を知る一番手軽な方法は、dirコマンドで’dir /X’とすると判ります。
C:\work\test>dir /X 2017/06/01 19:45 17,408 aaa.xls 2017/06/01 19:45 9,885 AAA~1.XLS aaa.xlsx D:\work\test>dir /X 2017/06/01 19:45 17,408 aaa.xls 2017/06/01 19:45 9,885 aaa.xlsx
CドライブとDドライブでちょっと違うところがありますね。
このdirコマンドのオプション’/X’の意味は、下記のとおりです。
/X このオプションは MS-DOS 形式以外のファイル名に対する短い名前を表示します。
そう、この8.3形式のファイル名が原因だったんです。
DirectoryInfo.GetFilesでは8.3形式のファイル名も検索の対象になっているようです。
Cドライブで”???.xls”を条件にしたときにaaa.xlsxがヒットしなかったのは拡張子が違ったからではなく、「ファイル名が3文字ではなかった」からです。
DirectoryInfo.GetFilesを使うときはこのあたりの動作も気を付けてください。
8.3形式の短いファイル名を生成しないようにするには、下記のリンクをどうぞ