2

Windows 最適化 API ( http://msdn.microsoft.com/en-us/library/aa363911(VS.85).aspx )を使用して単一のファイルを最適化しようとしていますが、十分な大きさの空き領域ブロックがない場合ファイルのスペースを空けるために、ファイルの他の部分を移動したいと考えています。

リンクされた記事では、他のファイルの移動部分について言及していますが、移動するファイルを見つける方法についての情報が見つかりません。空き領域ビットマップから、ほぼ十分な大きさの領域を見つけることができ、それを囲む論理クラスタ番号を知っていますが、これからどのファイルがそれを囲んでいるかを見つけることができず、移動する FSCTL_MOVE_FILE を実行するにはファイルへのハンドルが必要ですファイルの一部。

API を使用するか、MFT を解析して、論理クラスタ番号がどのファイルに属しているか、およびファイル内のどの仮想クラスタ番号がビットマップで見つかった論理クラスタ番号に対応しているかを調べる方法はありますか?

4

2 に答える 2

2

低速ですが互換性のある方法は、ファイルのすべてのディレクトリを再帰的にスキャンし、FSCTL_GET_RETRIEVAL_POINTERSを使用することです。次に、問題のクラスタの結果の VCN-LCN マッピングをスキャンします。

もう 1 つのオプションは、ドライブの USN ジャーナルをクエリしてファイル参照 IDを取得し、 FSCT_GET_NTFS_FILE_RECORDを使用して $MFT ファイル レコードを取得することです。

私は現在、読み込み時間と読み込みの遅れを減らすために、ディレクトリのファイル (たとえば、大きなゲームのすべてのファイル) を一緒にパックすることを目的として、単純なデフラグ プログラム (Java で記述) に取り組んでいます。

NTFS または FAT32 ドライブ上のファイル マッピングを取得するには、より高速な方法を使用します。

$MFT ファイルを直接解析するか (フォーマットにはいくつかの落とし穴があります)、ディレクトリと共に FAT32 ファイル アロケーション テーブルを解析します。

秘訣は、完全に共有された GENERIC 読み取り用に FileCreate でドライブ (例: "c:") を開くことです。結果のハンドルは、バイト単位で FileRead および FileSeek を使用して読み取ることができます。これは、管理者モード (または昇格) でのみ機能します。

NTFS では、$MFT が断片化されている可能性があり、ブート セクター情報から見つけるのが少し難しいです。C:\$MFT ファイルで FSCTL_GET_RETRIEVAL_POINTERS を使用して、そのクラスターを取得します。

FAT32 では、ブート セクタを解析して、FAT テーブルとルート ディレクトリ ファイルを含むクラスタを特定する必要があります。ディレクトリ エントリを解析し、サブディレクトリのクラスタを再帰的に見つける必要があります。

于 2010-09-05T20:43:30.747 に答える
0

ブロック # からファイルにマッピングする O(1) 方法はありません。そのブロックを含むファイルを探して、MFT 全体を調べる必要があります。

もちろん、稼働中のシステムでは、一度読み取ったデータは古くなるため、移動データ FSCTL でのエラーに備える必要があります。

于 2010-09-17T21:21:18.430 に答える