ハードリンク情報は、$FILE_NAMEPOSIX 名を使用して属性に格納されます。これらの各属性は、元のファイル自体を参照する可能性のあるファイルを参照します。ハードリンクのないファイルにも 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 を使用してください。