相変わらず、騷しいう~さん
kikyo

う~さんが飛び込んで来て「旦那、“長いパス問題” 解決したんやて、おめでとうございます」
『あぁ、今回は、話が通じんで苦労したで!』
「はよ、話聞かせて!」

「敵を知り、己を知れば、百戦して殆(あや)うからず」(孫子)

  • ※1「パスの最大長の制限 - Microsoft」
    Windows API では、パスの最大長 (MAX_PATH)は 260文字と定義されています
  • ※2「Windowsのファイル名・パス長の上限文字数についていろいろ」
  • ※3「ファイルマネージャー (Windows) - Wiki」
  • ※4「Windows File Manager (Winfile) - Github」 download

パスの最大長の制限の解除

longPathsEnabled-regedit
  • ファイルシステムが持つ最大パス長の制限を外す (Ref. ※1)
  • 管理者権限で レジストリエディタ を起動する
  • HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ FileSystem キーを開く
  • LongPathsEnabled = 1 に変更する
  • PC を再起動
    アプリが対応していないと(定数を抱えていると)何も変わりません

WinFile

Microsoft のオープンソースで興味深い物を見つけました。 2022-11-07
「Windows NT ファイルマネージャーのリメーク版です」

“Winfile は、Windows10 1607 以降で最大 1024 文字のパスを処理できます。
管理者として HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled=1 を設定します”
(さすがに、32,767文字は無理なようですが期待できそうですね… しかし期待外れのため issues#357 を投げました ^^);

回答 2022-11-15
General
NTFS は、最大 32767 文字の utf-16 文字のパス + ファイル名をサポートします。
ただし、個々のコンポーネント(サブフォルダー/最終ファイル)は、255 文字の制限があります。

Your Case
Winfile は、最大 1024 文字の utf-16 文字のパス + ファイル名をサポートします。
あなたは、上記の一般的な NTFS 制限に違反する、256 文字を超える単一のファイルを作成しようとしています。
Winfile と他のツールはこれを克服できません。

Winfile が NTFS 仕様に従って最大 1024 文字の長いパスで動作することを証明する小さなテストは、ここにあります。

Winfile
Longpath

Java で再検証してみます

AWKスクリプト (UTF-8、LF)
ファイルを作成しテストデータを書き込みます (パス: 256 char x 125 = 32000)
## LongPath <Input File...>
#
BEGIN {
   prefix = "D:/X"  # (4char)
   path50 = "----+----1----+----2----+----3----+----4----+----5"
   path100 = path50 "----+----6----+----7----+----8----+----9----+----0"
   path250 = path100 path100 path50
   path32k = ""
   loop = int((32000 - 4) / 256)
   for (i = 0; i < loop; i++) {
       path32k = path32k sprintf("/%05d", i+1) path250  # (6+250char)
   }
   filename = "/X" path100 path100 \
       "----+----1----+----2----+----3----+----4----+-" ".txt"  # (2+250char)
   path = prefix path32k filename
   print "Path length:", length(path) "\n" path
}
   {
   print NR, $0 > path
}
実行結果
Path length: 32000
D:/X/00001----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2----+----3----+----4----+----5/00002----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2----+----3----+----4----+----5/00003 ...

makefile
longPath :
   $(PLUS) sample/LongPath.awk sample/UTF8hello.txt

検証環境

  • Windows 10
  • Windows Terminal (オープンソース)、Windows PowerShell (オープンソース)
  • GNU Make (オープンソース)
  • Java 19 (オープンソース)
  • AWK˜plus for Java (オープンソース)

検証のまとめ

  • 検証中に Java パスの上限を見つけたため、32000 char で検証しました
    ※ java.io.IOException: Cannot access file with path exceeding 32000 characters
  • 検証結果の出力(D:\X\)は、エクスプローラーでは削除できません! ^^);
    長いパス:32k?に対応した「7-Zip」を使用して「Shift+Del」してください

気になったので調べてみた

Linux の場合: ファイル名の最大長は 255バイトです。
ファイル名とパス名の両方を結合した最大長は 4096バイトです。
この長さは、オペレーティング・システムでサポートされている PATH_MAXに一致します。
1 文字の Unicode表記が複数のバイトを占める場合があるため、
パス名とファイル名を構成する最大文字数は変化する可能性があります。
(IBM)
バイトベースなんや! ^^);

まとめ

う~さんがレスキュー対応に格上げしたツール
  • 7-Zip: 最大 32k文字(検証データ)の長いパスを扱える
  • Java: 最大 32000文字
  • WinFile: 最大 1024文字
  • Robocopy: 比較的新しいコマンドのため存在を忘れてました
    「Robocopy - Microsoft」コマンドオプションに /256 (長いパスのサポートの無効化) があります

長いパスへの対応は、なかなか進まないと思われますが、
少なくとも、エクスプローラー、ゴミ箱、Zip は対応が必要ですね。

「旦那、見事な仕切りですね~」
『あぁ、今日は終いにして飯食いに行こか?』

オープンソース

インストール

  1. Java をダウンロード(環境を汚さない .zip 版を推奨、複数の Javaもインストールできます)「Java Downloads」
  2. AWK~plus をダウンロード「AWK~plus for Java」 (コマンドを添付しています)
  3. AWK~plus フォルダ中の makefile の JAVAHOME 変数に Javaホームパスを設定します。

実行

ターミナルを開き、AWK~plus フォルダをカレントディレクトリにして、と入力します。

「Table of contents」 2022.11.18