2017-07-11 2 views
0

私はのディスク/パーティション(C :, D :, E :, F :,など)のNTFS MasterFileTable/USNジャーナルを使用しています。ディレクトリ。少なくとも現在のパーティション内で一意の一意のファイル/ディレクトリ識別子は、あるWinApi/USN/MasterFileTableを使用して、すべてのディスクのすべてのファイルに一意のIDを割り当てる方法はありますか?

DWORDLONG  FileReferenceNumber; 

私はUSN_RECORD(とも呼ばれるPUSN_RECORD)を読んでいる間は、このint64型があります。

しかし、衝突があるかもしれません:

  • Cでファイル:DにFileReferenceNumber 1932847
  • に別のファイルを持つことができます:あまりにもFileReferenceNumber 1932847を持つことができます!

私はこのような大きなものを使用する必要がないようしたいと思いint128(つまり、ドライブのFileReferenceNumber + 5ビットの64ビットとなり、文字C:、D:、E:... 、Z :)。

また、(char DriveLetter, DWORDLONG FileReferenceNumber)のペアを使用してコンピュータ内のファイルを識別することを避けたいと考えています。

64ビットintをコード化する方法FileReferenceNumber +ドライブレター?

FileReferenceNumberには空きビットがいくつかありますか?

もしそうでなければ、どうしますか?

+0

ドライブレターの使用は必ずしも十分ではありません。複数のボリュームを同じドライブ文字の下にマウントすることができます。 –

+0

@HarryJohnston How?あなたは例を挙げることができますか? – Basj

+0

https://technet.microsoft.com/en-us/library/cc753321(v=ws.11).aspx –

答えて

1

FileReferenceNumber/FileIDと "volume something"のペアを使用する必要があります。 mount a volume in a folderすることができますので、ドライブレターを実際に使用することはできません。

「ボリューム何か」はvolume GUID pathですが、サイズが重要な場合はボリュームシリアル番号を使用できます。注:すべてのボリュームにGUIDがあるわけではありません。

NTFSの場合、GetFileInformationByHandleから取得し、32ビット+ 64ビットのペアを構築できます。 ReFSの場合、GetFileInformationByHandleExが必要で、64ビット+ 128ビットのペアを構築します。

+0

確かに、「\\。\ C:」のMasterFileTable( 'FSCTL_ENUM_USN_DATA')を列挙しています。私は、このボリューム/パーティション内のファイルのFileReferenceNumberのみを持ち、C:\ MOUNTEDFOLDER \(これは別のボリュームがCのフォルダとしてマウントされている場合)ではないでしょうか? – Basj

+0

これまでは、キーが 'FileReferenceNumber's、つまりint64のマップ' std :: map 'を使用していました。これは非常に効率的でした。マップキーとして* pairs *(volume、fileID)を使用する必要がある場合は、それはずっと遅くなりますので、@Andersとは思いませんか?整数をマップキーとして使用することは確かに高速です。 – Basj

+0

ボリュームシリアル番号の使用はかなり安全ですが、GUIDだけがAFAIK固有のものであることが保証されています。 FSCTL_ENUM_USN_DATAの詳細はわかりませんが、MFTで動作する場合はマウントされたボリュームからエントリを返さず、ボリュームがマウントされているフォルダのみを返します。 (いずれにしても簡単にテストすることができます)。 – Anders

関連する問題