1

私は最近、プログラムで再解析ポイントを操作していろいろと遊んでいますが、しばらくの間、何かが私を悩ませています。Windows のハード リンクはジャンクションやシンボリック リンクのような再解析ポイントではないため、同じ方法でアクセスすることはできません。新しいものを作成するのは簡単ですが、そのターゲットを読み取る方法はまだわかりません。Hard Link Shell Extensionのような拡張機能には、その情報を表示するプロパティ シートがあるため、実行できると思いますが、その方法に関するドキュメントを見つけることができませんでした。(ただし、シェル拡張子は、ハードリンク上の実際のファイルを示していないことに気付きました)

ファイルへのリンクを数える方法を説明しているこの回答を見つけましたが、残念ながら、まだ解決できていません。

4

4 に答える 4

2

ハードリンク情報は、$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 を使用してください。

于 2012-07-11T00:18:38.213 に答える
0

Windows のジャンクション ポイント専用の C++ ライブラリを作成し、MIT ライセンスの下でオープン ソースとして公開しています。ハードリンクを言うが、それらを解決する方法を尋ねるので、これがあなたの質問からは不明です。

于 2012-04-21T20:58:23.710 に答える