SSブログ

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 個のファイルをコピーしました


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。