◆ fsutil file queryFileID <filepath>

ファイルの ID が欲しいことってありますよね
ファイルに対してメタデータを保持しようとしたときにパスをキーにしてもパスは固定ではありません
移動したら保持できなくなるのは困ります

探してみると「fsutil file queryFileID」を使えばファイルの ID を取得できるようです
また ID から今のフルパスを取得することもできます
ファイルを移動しても移動後のパスを取得できます
ショートカットはシンボリックリンクと違って移動後も有効ですが この仕組みを使ってるのかもしれませんね

使ってみた例です

C:\Users\winuser\Desktop>mkdir x

C:\Users\winuser\Desktop>cd x

C:\Users\winuser\Desktop\x>echo aaa > 1.txt

C:\Users\winuser\Desktop\x>fsutil file queryFileID 1.txt
ファイル ID は 0x000000000000000000160000000d8144 です

C:\Users\winuser\Desktop\x>move 1.txt 2.txt
1 個のファイルを移動しました。

C:\Users\winuser\Desktop\x>fsutil file queryFileID 2.txt
ファイル ID は 0x000000000000000000160000000d8144 です

C:\Users\winuser\Desktop\x>copy 2.txt 3.txt
1 個のファイルをコピーしました。

C:\Users\winuser\Desktop\x>fsutil file queryFileID 2.txt
ファイル ID は 0x000000000000000000160000000d8144 です

C:\Users\winuser\Desktop\x>fsutil file queryFileID 3.txt
ファイル ID は 0x0000000000000000001500000003773a です

C:\Users\winuser\Desktop\x>echo bbb >> 3.txt

C:\Users\winuser\Desktop\x>fsutil file queryFileID 3.txt
ファイル ID は 0x0000000000000000001500000003773a です

C:\Users\winuser\Desktop\x>fsutil file queryFileID .
ファイル ID は 0x0000000000000000002200000003789f です

移動(リネーム)したり 追記したりしても ID は変わりません

コピーした場合は中身は一緒でも別物になります
コピーして同じであってほしいのなら それは中身に応じて一意な値ですし それなら追記すれば変わります
そういう ID が欲しいならハッシュ値をつかうのが良さそうです

ファイルに限らずフォルダの ID も取得できました

ID からパスを取得するには「fsutil file queryFileNameById」を使います
ID だったり Id だったりしますがヘルプに書いてるとおりにしてます
大文字小文字はどっちでも動きます

queryFileNameById で取得できるパスは 「C:\」 から始まるフルパスとはちょっと違います
「このファイルへのランダム リンク名は \\?\C:\Users~」という出力でした

「\\?\」 から始まるのは Volume で見ますね
「\\?\Volume{GUID}\」 形式です

「ランダムリンク名」と書かれていますが ドキュメントでは「DOS デバイスパス」となっています
とりあえず ファイル名を取得するなら最初の 4 文字消せばドライブ名から始まるフルパスになるということでよさそうです

また fsutil は Windows 7 では管理者権限を要求されますが Windows 10 では管理者権限不要でした