ハードリンク情報は、$FILE_NAME
POSIX 名を使用して属性に格納されます。これらの各属性は、元のファイル自体を参照する可能性のあるファイルを参照します。ハードリンクのないファイルにも POSIX 名がある場合があります。つまり、ハードリンクされたファイルには常に複数の POSIX 名があります。属性のDirectoryFileReferenceNumber
フィールドは、ファイルを含むフォルダ エントリである MFT エントリ インデックスを指します。
ハードリンクされているかどうかに関係なく、ファイルのすべてのターゲットを取得するためのガイドを次に示します。
FSCTL_GET_NTFS_FILE_RECORD
すべての NTFS 属性を取得し、それを解析して各属性を取得するには、ファイルに対してを使用する必要があり$FILE_NAME
ます。
各$FILE_NAME
属性で、ファイルのフォルダー コンテナー情報を取得するために、MFT エントリ インデックスとしてFSCTL_GET_NTFS_FILE_RECORD
使用して、ファイルが存在するボリュームで使用します。DirectoryFileReferenceNumber
このフォルダーは、ファイルを含む最下位レベルです。たとえば、ファイル パスが のC:\MyData\Myfiles\MyDocument.txt
場合、最下位のフォルダ レベルはMyFiles
です。DirectoryFileReferenceNumber
がルート フォルダ ( ) を指している場合0x5
、ファイルのフル パスを取得できます。たとえば、C:\MyDocument.txt
.
そのフォルダー情報を使用して、それがルート フォルダーでない場合は、属性のName
フィールドからフォルダー名を取得するという上記と同様のタスクを繰り返すだけです。$FILE_NAME
ただし、今回NameType
は POSIX 型である必要はなく、任意の型を使用できます。できればLFNかLFN&DOS8.3互換タイプ。それを使用しDirectoryFileReferenceNumber
て上位フォルダー レベルを取得し、この段落のタスクを繰り返します。DirectoryFileReferenceNumber
がルート フォルダ ( ) を指している場合0x5
、ファイルのフル パスが既にわかっているため、この繰り返しのタスクは完了しています。
これで、1 つのファイル ターゲットが解決されました。次のタスクは、POSIX タイプの次の$FILE_NAME
属性を処理することです。NameType
それらをすべて処理して、すべてのファイル ターゲットを取得します。このメソッドを使用して、ファイルにハードリンクがあるかどうかを確認しないでください。代わりに、GetFileAttributes
はるかに高速な function を使用してください。