う~さんの「転ばぬ先の杖」
kikyo

う~さんは、普段使い PC と非常用(Emergency) PC を持っています。

  • 普段使い PC
  • Intel Core i5 2.6GHz, RAM:8GB, SSD:500GB, 38+α千円 (Windows 11 非適合機)
  • Windows 10 pro 「バージョン 22H2」サポート:2025年10月まで予定
  • 非常用(Emergency) PC
  • Intel Core i5 2.6GHz, RAM:4GB, HDD:300GB
    3cm ほど液晶切れが有るため、ジャンクとして 9千円で入手しました
  • Windows 10 home 「バージョン 21H1」サポート:2022年12月まで
    ライセンスキーが飛び、Windows Update に失敗し、回復ドライブでの初期化に失敗

途方にくれましたが、非常用の購入目的に立ち戻って「Firefox」が動けば良い、
CPUは「普段使い」と変わらないため、「Linux Mint Cinnamon」をインストールしました。
ファイルシステムは、ZFSを選択 (推奨システム要件:RAM:4GB, HDD:100GB) 2022-10-22

「Firefoxのプロファイル」をコピーできない!

longPath-Ex
  1. 「Windows エクスプローラー」で長いパスが原因で「Firefox のプロファイル」をコピーできない!
  2. 「標準 Zip」での圧縮は瞬殺、またお前か!^^);
  3. 「7-Zip」で圧縮・解凍を確認、OK
  4. 「標準 Zip」での解凍は、NG
  5. 「7-Zip」を使用して、無事 Linux に移行できました。
  • その他、気付いたこと
  • 「エクスプローラー」はこのファイルに限り削除可能
  • 「Xcopy」でコピー可能(相対コピーしているのかな?)
  • 「OneDrive」は積極的には利用していないためこの URLは不要、ましてや Linux なら
  • オープンソースならこんな仕様は、許されないですね ^^);

longPath-Zip

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

  • ※1「パスの最大長の制限 - Microsoft」
    Windows API では、パスの最大長 (MAX_PATH)は 260文字と定義されています
  • ※2「Windows システムのファイル パス形式 - Microsoft」

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

longPathsEnabled-regedit
  • ファイルシステムが持つ最大パス長の制限を外す (Ref. ※1)
  • 管理者権限で レジストリエディタ を起動する
  • HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ FileSystem キーを開く
  • DWORD値「LongPathsEnabled」を開いて、データを「1」に変更する
  • レジストリエディタを終了し、PC を再起動する
  • ただし、これは特定の API に対してのみ有効 (Windows 10からの機能のため対応アプリは少ないと思われます、Ref. ※1)

Java で検証してみます

AWKスクリプト (UTF-8、LF、Ref. ※2)
ファイルを作成しテストデータを書き込みます
## LongPath <Input File...>
#
BEGIN {
   prefix = "tmp/"
# prefix = "D:/X/"
# prefix = "//?/D:/X/"
   path50 = "----+----1----+----2----+----3----+----4----+----5"
   path100 = path50 "----+----6----+----7----+----8----+----9----+----0"
   path250 = path100 path100 path50
   additional = "4"
   path = prefix path250 additional ".txt"
   print "Path length:", length(path), path
}
   {
   print NR, $0 > path
}
テストデータ (UTF-8、LF)
hello
こんにちわ
안녕하세요
你好
makefile
longPath :
   $(PLUS) sample/LongPath.awk sample/UTF8hello.txt

検証環境

  • Windows 10
  • Windows Terminal (オープンソース)、Windows コマンドプロンプト
  • GNU Make (オープンソース)
  • Java 19 (オープンソース)
  • AWK˜plus for Java (オープンソース)

検証のまとめ

  • Java は長いパスに対応していません (ネイティブコード「マシン語」で落ちた)
  • 相対パス: ~259文字
  • 絶対パス: ~261文字
  • デバイス パス指定子 (\\?\): ~264文字
  • ファイルの操作
    • 「エクスプローラー」は、リネーム・削除できない
      『ダブルクリック』 or 『プログラムから開く』でアプリの起動は可能
    • 「ゴミ箱」はドラッグ&ドロップに無応答、アプリでゴミ箱に移動した場合はエラー
    • 「DEL」コマンドを使用するか親フォルダごと消す

まとめ

う~さんがレスキュー対応に格上げしたツール
  • 7-Zip: ファイル名を短くすることは可能、「ゴミ箱」が対応していないため「Shift+Del」で削除
  • Notepad++: 長いファイル名は、8.3形式の短いファイル名で編集 (仕組み上ファイル名の制限無し)
  • FastCopy: ユーザボリュームの差分バックアップに使用、少なくとも検証データには対応しているが上限は不明
  • Robocopy: 比較的新しいコマンドのため存在を忘れてました
    「Robocopy - Microsoft」コマンドオプションに /256 (長いパスのサポートの無効化があります)
  • Xcopy (参考):「 Xcopy - Microsoft」コマンドオプションに /N (生成された短い名前でコピーがあります)

長いパスへの対応は、なかなか進まないと思われますが、
少なくとも、エクスプローラー、ゴミ箱、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.10.27