2020年12月1日火曜日

PC USB メモリで Junction は無謀

1台の PC で使っている場合は、多くは、トラブりません。
でも、複数の PC に挿せば、途端に破綻します、 USB メモリ上の Junction 。
これは、パスが 絶対パス だから。
相対パス は許され無いので ... 。


Local HDD/SSD 上に、良く、Junction を貼ります。
便利だから、ですね。

さて、近年、USB メモリ も容量が増え、
それに連れて、格納データ量も増加の一途です。
膨大になって来れば、整理整頓も大事!。
斯くして、分類上、どうしても複数のものに属させたい事だって起こります。
そんな時には、コピーを作るのでは無く、リンクを活用すれば一元管理が可能ですね。
はい。  Junction を使いたい処。
複数の親から引ける様にして置きたい、 そんな時。
或いは、
同一 USB メモリ内の深い場所に置いた とある Sub Folder を、別の場所からも参照したい、そんなケースです。

でも、Local HDD/SSD と同じ調子で、USB メモリ上 に作れば ... 。

これは、USB メモリに限りません。  外付け HDD/SSD 等でも同じ事。  きっと、ね。


一見、問題無さそうですが、 実は、実は。

USB メモリ等は ドライブレター が完全固定では無く、可変である事が原因!。
既定で割り振られたドライブレターが使用中であれば、それは変わて仕舞いますから。


解決策は、

   管理者で昇格し、シンボリックリンクを Folder (Directory) に貼る!、

ですね。

この時に、絶対パスでは無く、相対パス で貼ります。
Symbolic Link なら OK で、Junction では駄目なのでしたね、 相対指定。

  Junction の場合、相対で書けても、内部では、ドライブを含む絶対パスでその場所が保持されています。
  それ故、もし、作成時のドライブレターから変わって仕舞えば、そのリンクは機能し無くなる!、 と。
  cmd.exe dir コマンドで確認が出来ると思います。  以下の例は、ちょっと古い OS でのもの。


Microsoft Windows [Version 10.0.19041.572]
(c) 2020 Microsoft Corporation. All rights reserved.

C:¥WINDOWS¥system32>cd H:¥
C:¥WINDOWS¥system32>
C:¥WINDOWS¥system32>mklink /d H:¥OtherHomeDir¥SomeSubDir ¥SomeHomeDir¥SomeSubDir
H:¥OtherHomeDir¥SomeSubDir <<===>> ¥SomeHomeDir¥SomeSubDir のシンボリック リンクが作成されました

C:¥WINDOWS¥system32>


相対パスの良くあるトラブルは、親の立ち位置を考慮せずに、混乱する事。
ですから、一般的には、上の例の様に、 ルートをカレントにした上で、記述すれば少しは混乱を避けられる気もします。

しかし、 実際には、
mklink では、カレントは無視されて、記述文のリンク場所から解釈されている筈(?)なので、
¥ から書き出せば、該当ドライブのルートからのパスになっている、と思うのですが ... (?)。

  .¥   カレント
  ..¥  親
  ¥    ルート

  相対時の基底は、指定したリンクのパスが採用される筈  上の例なら、H:¥OtherHomeDir¥SomeSubDir からの相対。


尚、
Junction / Symbolic Link 共に、リンクを削除するには rmdir 若しくは その短縮形 rd です。
類似のコマンド del や erase では、配下のファイル群 も消されて仕舞いますので、 絶対に、使わないで!。



これで、PC を変えて、USB メモリ 等を挿しても、同一メモリ内のリンクを正確に処理する筈です。


あ~、びっくりしたぁ。  XO



0 件のコメント:

コメントを投稿