2012-02-19 7 views
2

Javaで複写ファインダーを作成しましたが、ハードリンクサポートを含める必要があります。残念ながら、JavaのファイルのMFTエントリを調べる方法はないようです。JavaまたはC++を使用してファイルMFTエントリ/ iノードを取得する方法

BasicFileAttributeViewクラスにfileKey()というメソッドがありますが、NTFSファイルシステムでは機能しません(まだextにはテストされていません)。

また、メソッドisSameFile()(java.nio.file.Path)が見つかりました。誰でもこの方法の仕組みを知っていますか?それは正しいことをしているようですが、ブール値を返すので、私にとっては無駄です(結果をマップに入れ、MFTエントリでグループ化したい)。

私はいつも各ファイルの作成時間や変更時間などを比較できますが、これはあきらめるだけです。

私はC++またはJavaで何をしようとしていますか?私はextよりもNTFS上で動作させることについてもっと気にしています。

答えて

1

あなたは(あなたが既にハンドルを持っている場合、またはNtQueryInformationFileとともにFILE_INTERNAL_INFORMATION構造)は、Windows XP以降ntdll.dll(利用可能な内NtQueryDirectoryFile機能とともにFILE_ID_FULL_DIRECTORY_INFORMATION構造を使用する必要があり、場合にFileReferenceNumberメンバーをチェック8バイトのファイルIDを取得し、それらが同じかどうかを確認してください。

彼らは同じファイルある場合、これはあなたを教えてくれますが、彼らは同じファイルの同じストリームあるない場合。

2つのファイルがユーザーモードの同じストリームであるかどうかを確認する方法がわかりません - ファイルに関連付けられたすべてのストリームを返すことができるFILE_STREAM_INFORMATIONという名前の構造がありますが、それは現在あなたが開いているストリームはです。

1

ハードリンクの検出は通常、FindFirstFileNameWを呼び出して行います。しかし、より低いレベルの方法があります。

iノードに相当するNTFSを取得するには、FSCTL_GET_OBJECT_ID ioctlコードを試してください。

BY_HANDLE_FILE_INFORMATION structureにも一意の(ファイルが削除されるまで)識別子があります。

ボリュームにUSN変更ジャーナルが有効になっている場合は、FSCTL_READ_FILE_USN_DATA ioctlコードを発行できます。 USN_RECORD structure

+0

ありがとうたくさんBY_HANDLE_FILE_INFORMATIONはトリックをしました。 – user1079475

0

Javaでは、NTFS Inodeの非透過エンクロージャであるsun.nio.ch.FileKeyを使用できます。すべてのハードリンクは同じInodeを共有します。

あなたはハードリンクを収集する必要がある場合はそのため、あなたは(例えばFileKeyのペアを置くことによって - >Multimapにファイル)の各容疑者からFileKeyを作成し、それらを比較することができ

関連する問題