どっとねっとの(ファイル|ディレクトリ)操作 API がふんにゃかへんにゃかした

きっかけは、PathTooLongException を、catch 句が拾ったからだった。
問題のパスはファイルも合わせると、266 になってしまうようだ。
ファイル名だけで 91 文字とか、あふぉだr(ry
ゲフンゲホン、91 文字もあるのがいけなかったようだが、MAX_PATH が 260 しかないのに
実際のパスは 260 超えられるとかおかしいと思う。

しかし、Directory.GetFiles(1) だとうまくいった。
で、File.Exists(1) 使うと PathTooLongException は出ないけれど、存在していても false が返ってくる。
しかし、FileInfoDirectoryInfo のコンストラクタで PathTooLongException が投げられるので使えない。
こうすると使えるのだが、FullName などを参照するとやっぱり PathTooLongException が投げられるのでうにょ〜んな感じ。

DirectoryInfo original_dir = new DirectoryIndo( long_long_length_path );

foreach ( FileSystemInfo entry in original_dir.GetFileSystemInfos() ) {
    Console.WriteLine( entry.FullName );   // ! ここでスローされる
}

こんなコードの時に、 original_dir に 260 を超える FullName を持つ、
ファイルエントリ*1があるとき、FullName を参照するだけで、
PathTooLongException が投げられてしまうのだ。

CreateFile には:

Windows NT/2000:この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。 この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加してください。 詳細については(ry

と書いてある。
しかし、.NET ver 2.0 では、260 までしか認めてくれないらしく、260 以上のパスはシカトされる。
File.Exists(1) さえ、260 以上のパスには false を返す。

GetFiles() では、取得できる*2が、
他の(ファイル|ディレクトリ)操作関数がんなことできないので\(^o^)/オワタ

*1:ファイルとフォルダの総称

*2:Find* 系ではね