Windowsでパスが長すぎるファイルを作る方法 [Windows]
ファイルパスを収集するツールを書いていて、存在するファイルに対して .NETのSystem.IO.File.Exists()がfalseを返す現象に遭遇した。
特殊な属性またはパスが深いせいかとググると「WindowsのMAX_PATHは260で、パスを表現できる文字数はそこからヌルストップを除いた259文字」と。
(なおファイルシステムの制限ははるかに長くNTFS/FAT32とも32760文字。Windows Dev Center "File System Functionality Comparison"参照)
問題のパスは283文字だったのでコレと思われる。今回さほど問題ではないんだけど、こういうものを扱う機会もあるかもしれないので、なんとなくサンプルを作る。
1. ディレクトリ "F:\1234\"(ファイルパスに含まれるときデリミタ含め8文字) を作る。
F:\>mkdir F:\1234
2. その下に250文字、251文字のファイル名を持つ2ファイルを作る。
→ 上の8文字と合わせてフルパスはそれぞれ258/259文字になる。
(↓ 実際には"1234"の後で折り返さない)
F:\>echo > F:\1234\________________________________________________50_______________________________________________100_______________________________________________150_______________________________________________200_______________________________________________250
F:\>echo > F:\1234\________________________________________________50_______________________________________________100_______________________________________________150_______________________________________________200_______________________________________________250_
3. ディレクトリ名を1文字長くする。
→ フルパスは259/260文字になる。
F:\>rename F:\1234 12345
この結果、①パスの長さを保ったままXCOPYしようとすると長い方のファイル(パス260文字)は無視されて1個だけコピーされる。
F:\>xcopy F:\12345 F:\ABCDE
F:\ABCDE は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)? D
F:\12345\________________________________________________50_______________________________________________100_______________________________________________150_______________________________________________200_______________________________________________250
1 個のファイルをコピーしました
②パスをさらに長くしようとすると全て失敗する。
F:\>xcopy F:\12345 F:\123456
F:\123456 は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)? D
メモリが足りません
0 個のファイルをコピーしました
コメント 0