免責事項
この記事は個人メモとして書き留めておいたものを、分かりやすく纏めてみたものです。記事内容に間違い・補足事項等の指摘があれば適宜修正したいと思いますが、記事の内容を100%保証するものではありません。予めご了承ください。
はじめに
Windowsのロングファイルパスは、その仕様を把握しておかないとバックアップがきちんと取得できないなどの問題が発生する可能性があります。
ロングファイルパス仕様
MSサイトから
https://msdn.microsoft.com/ja-jp/library/930f87yf%28VS.80%29.aspx
後部のメモ欄に非常に重要な情報が散りばめられています。
本題から逸れますが、Windows95から対応した『ロングファイルネーム』は最大250文字となっています。(※これが『ファイルパス』ではないことに注意してください。)それ以前のDOS環境では、ABCD1234.txt といったファイル名が最大の、いわゆる8.3形式でした。
対して、『ファイルパス』はOSとしては32768文字までサポートしています。
ただし互換性保持のため、通常は、WindowsAPI仕様による、_MAX_PATH=260では、最後のNUL文字を加味し、「ファイルのフルパス指定」のアクセスは259文字以下である必要があります。(以降、MAX_PATH制約と記載します。)
ファイルへのフルパスがMAX_PATH制約を超えた場合のエラーはWindows7や10のエクスプローラーでも発生し、コピーやリネーム等の操作でもエラーになります。(そのファイルへ、そのパスではアクセスできないため。)
つまり、エクスプローラーをはじめ、多くのソフトは、ロングファイルパスに対応していません。
いくつかのソフトの対応状況
ソフト名称等 | ロングファイルパス対応 | 備考 |
---|---|---|
Explorer | × | |
BunBackup | × | |
BunBackup L版 | ○ | ロングファイルパス対応版 |
ArcServe | △ | 500文字前後までOK |
WinMerge | × | |
7-Zip | ○ | ファイルマネージャで操作可能 |
・BunBackupのロングファイルパス対応版は、別に用意されています。
これはバックアップ先などで階層が深くなり、長いパスになった場合に、バックアップしたファイルの操作がエクスプローラーなどからは出来なくなるため、標準版とは別に用意しているのではないかと思います。
・ArcServeではバージョンによって異なるようですが、およそ500文字前後のパスをサポートしています。通常、ファイルサーバーなどに於いて、一般ユーザーなどが、エクスプローラーなどで共有フォルダのファイルを操作する場合は、基本的にはMAX_PATH制約の範囲内でしか操作できないので、余程バックアップ先の階層を深くしない限りは、500文字もあれば十分かと考えられます。(厳密には、一般ユーザーでも、階層の途中のフォルダ名をより長いものに変更することで、MAX_PATH制約を超える状態は生み出せますが。)
Wiki系などでのタイトル名からの自動ファイル生成などでも、単体ファイルは250文字なので、ある程度注意を払えば、500文字を超える状態は回避できるかと思います。
・Explorerのフォルダのプロパティ画面で表示される「ファイル数やフォルダ数」はMAX_PATH制約の影響を受け、MAX_PATH制約を超えるファイルパスが配下にある場合は、正しく表示されないことがあります。またOSのバージョンによって挙動が異なるようです。
あとがき
あるファイルサーバーの移行作業準備のため、BunBackup L版にてバックアップし、そのファイル数(100万ファイル程度)が正しいかを確認していた際、エクスプローラーでのファイル数表示では一致せず、WinMergeでも差異を正しく確認できませんでした。
このため、他の原因(内部で何かがファイルを自動更新しているのか等)を探ったり、他の原因を想定したりと、余計な時間をかなり費やしました。やっと確認手段側の問題ではないかという推測にたどり着き、7-Zipのファイルマネージャにて、ファイル件数のみの確認ではありますが、一致を確認できました。
この手の問題は、(特に自分のような技術力不足の者にとっては、)一度トラブルに陥ると、解決までに長い時間、混乱という名の海を彷徨うことになります。
備忘録として留めておいたものを、他の方の役に立てばと推敲しました。(まだまだ読みにくい部分があるかとは思いますが。)