質問: @"d:\tmp"; Directory.GetFiles(path2, "*.xls"); // sample.xls のみ取得できる ``` Directory.GetFiles メソッド.aspx) MSDN を参照すると、必ず xls, xlsx どちらのファイルも取得できると考えています。 以下、MSDN(Directory.GetFiles)のメモを引用 > > アスタリスクのワイルドカード文字を使用する場合、 searchPattern 「*.txt」など、指定した拡張子の文字数影響を与えます検索次ようにします。 > > 指定された拡張機能が 3 文字の場合は、指定した拡張子が始まる拡張子を持つファイルを返します。 > > たとえば、「*.xls」には、"book.xls"と"book.xlsx"両方が返されます。 > > その他のすべてのケースでは、メソッドは、指定された拡張機能を正確に一致するファイルを返します。 > > たとえば、"* .ai"が"file.ai"、"file.aif"を返します。 > > 疑問符 () のワイルドカード文字を使用すると、このメソッドは、指定されたファイル拡張子に一致するファイルのみを返します。 > > たとえば、ディレクトリの検索パターンに 2 つのファイル、"file1.txt"および"file1.txtother"指定された"ファイル? です。txt"は最初のファイルだけを返し、"file*.txt"の検索パターンには、両方のファイルが返されます。 > > > なぜDドライブ内のフォルダーに対しては xlsx が取得できないのでしょうか? ご存じの方がいらっしゃいましたら、ご回答いただけますようお願いいたします。 【追記】 検証情報をいただいたため、追記します。 ・Windows7環境では現象が発生しません ・ドライブはいずれもNTFSです ・Windows10、及びWindowsServer2016で現象を確認しています。 以上
回答: どうやら、"8.3形式のファイル名を生成するか否か"の設定が影響するようですね。 昔のOSではファイル名はドットの前が8文字まで、ドットの後が3文字まで、という制限がありました。 これを"8.3形式"と呼んだりします。 その名残で、今のWindowsでも内部的に8.3形式の名前を持つことがあり、 `dir`コマンドに`/x`オプションをつけると8.3形式の名前が確認できます。 ``` C:\tmp>dir /x ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 857D-9700 です C:\tmp のディレクトリ 2017/01/27 13:41 . 2017/01/27 13:41 .. 2017/01/27 13:02 22,528 sample.xls 2017/01/27 13:01 6,265 SAMPLE~1.XLS sample.xlsx 2 個のファイル 28,793 バイト 2 個のディレクトリ 683,712,335,872 バイトの空き領域 C:\tmp>d: D:\>cd tmp D:\tmp>dir /x ドライブ D のボリューム ラベルは vhd です ボリューム シリアル番号は F4D3-1360 です D:\tmp のディレクトリ 2017/01/27 13:28 . 2017/01/27 13:28 .. 2017/01/27 13:02 22,528 sample.xls 2017/01/27 13:01 6,265 sample.xlsx 2 個のファイル 28,793 バイト 2 個のディレクトリ 1,045,876,736 バイトの空き領域 ``` 8.3形式のファイル名を生成するか否かは、ボリュームごとに設定することができます(Windows 7以降)。 たとえば私の環境の場合、Cは有効、VHDでNTFSにしたDは無効でした。 ``` C:\WINDOWS\system32>fsutil behavior query disable8dot3 c: ボリュームの状態は 0 です (8dot3 名の作成は有効です)。 レジストリの状態は 2 です (ボリューム単位で設定します - 既定値)。 上の 2 つの設定に基づいて、8dot3 名の作成は c: で有効です C:\WINDOWS\system32>fsutil behavior query disable8dot3 d: ボリュームの状態は 1 です (8dot3 名の作成は無効です)。 レジストリの状態は 2 です (ボリューム単位で設定します - 既定値)。 上の 2 つの設定に基づいて、8dot3 名の作成は d: で無効です ``` `System.IO.Directory.GetFiles`メソッドは、この8.3形式の名前も検索対象に含むようです。 そのため、8.3形式が有効なCでは2ファイルが取得され、 8.3形式が無効なDでは1ファイルのみ取得された、 ということのようです。 以上、まとめますと、 * 8.3形式が有効なボリュームかどうかによって`System.IO.Directory.GetFiles`メソッドの挙動は異なる * 8.3形式が有効かどうかは`fsutil behavior query disable8dot3`で確認できる ということになります。 参考: 8.3形式の短いファイル名を生成しないようにする - @IT