.NET Frameworkでのファイル最大長
Windowsのファイル名の最大長考察で最大ファイル名を少し試してみました。最後のPowerShellでより長いファイル名が扱えないということが疑問だったので、.NET Frameworkで試してみましょう。
1: FileInfo fi = new FileInfo(@"c:\temp");
2: DirectoryInfo di = new DirectoryInfo(@"c:\temp");
3: FileInfo[] files = di.GetFiles("*.txt");
4:
5: foreach (FileInfo oneFile in files) {
6: Console.WriteLine("{0}, {1}", oneFile, oneFile.FullName.Length);
7: }
前回のプログラムで作った\\?\形式でないとアクセスできないファイルをこのロジックに通すと、FullNameプロパティでSystem.IO.PathTooLongException例外が発生します。
PowerShellは例外が発生したオブジェクトは内部で管理しないから(?)Get-Itemで表示されないんでしょうかね。
.NET Frameworkがこういう実装ってことは、長いファイルを扱うことになる場合、MS-DOS互換用に生成されている、8+3形式のファイル名にする、フォルダの階層が深い場合、途中のフォルダをネットワークドライブとしてマウントすればなんとか回避可能です(KB320081にもそういう回避方法が例示されています)。
COM,CLOCK,LPT,AUX,PRTといった、DOS互換のために残されている使ってはいけないファイル名だと\\?\形式で削除できる可能性があります。Windows版IBM-PC版の時計アプリはCLOCK.EXEだったけど、PC-9801ではCLOCKがデバイス名として予約されていたので、TOKEI.EXEに改名されたのは有名な話。Windows 95ではCLOCK.EXEそのものがなくなりましたが。