どこまでいってもプログラマ

プログラマ的なお話を書いていきます。あと雑記もちょろっとね。

System.IO.Directory.GetFiles の挙動

はじめに

仕事で Directory.Getfiles を利用した時に、どうやら動きに一貫性がないことが分かった。

Directory.GetFiles(path, “*.xls”); // sample.xls, sample.xlsx どちらも取得できる

こんな感じでコードを書いた時、対象のドライブによって結果が違うのだ。

私のPCでは、
Cドライブ上のディレクトリに対して実行した場合は、コメントどおりに「xlsx」ファイルも取得できた。
しかし、Dドライブ上のディレクトリに対して実行した場合は「xlsx」が取得できない。

なぜだろう。

結局わからなくて teratail で聞いてみた

私が投稿した質問です。
ベストアンサーを読んでいただければ回答が得られます。

teratail.com

簡単にまとめる

そもそも、MSDNにあるように、ワイルドカード+3文字拡張子を指定した場合は、4文字以上の拡張子も取得できるはずです。

https://msdn.microsoft.com/ja-jp/library/wz42302f(v=vs.110).aspx

ただし、ドライブの設定によっては、4文字以上の拡張子が取得できない場合があります。

それが「8.3形式のファイル名」が「無効」である場合です。

つまり、C# とか関係なく Windows の仕様です。

8.3形式のファイル名が有効か無効かを調べる

管理者権限で、以下のコマンドラインを実行すれば確認できます。
※最後の「c:」はドライブ名を入れます

fsutil behavior query disable8dot3 c:

「8.3形式」の有効 / 無効を切り替えるにはこちら

fsutil behavior set disable8dot3 c: 0 // Cドライブの設定を有効にする

fsutil behavior set disable8dot3 c: 1 // Cドライブの設定を無効にする

設定が「disable8dot3」なので、0が有効になるんですね。
否定の否定でしっくりこないなー。

さいごに

つまり、何が言いたいかというと、teratail すごいってことね。
stackoverflow もいいけど、困ったらとりあえず teratail で聞いてみましょうって思う。
もちろん、ちゃんと質問できるレベルまでは自分で調べるけどね。

レッツteratail !!

teratail.com

今日はここまで