5

私の C# アプリケーションでは、既にファイル システムを調べる方法がありますが、マスター ファイル テーブル (MFT) からの読み取りを利用したいと考えています。私は、1) 独自の仕様であるため、予告なしに変更される可能性があること、および 2) アプリケーションが管理者権限で実行されている場合にのみアクセスできることを理解しています。

このコードを介してマスター ファイル テーブルを読み取ることができました。MFT クエリから、ファイル名といわゆるファイル参照番号を取得します。私が見つけられないのは、ファイル サイズ、フル パス、日付など、問題のファイル/フォルダーに関する詳細情報を取得できるように、.NET FileInfo オブジェクト、または Windows API ファイル ハンドルに移行する方法です。スタンプなど

4

1 に答える 1

4

MFT に潜んでいるときにファイルを開くには、2 つの簡単な方法があります。そのファイル参照番号 (Vista 以降) を使用してOpenFileByIDを呼び出すか、リストをたどって完全修飾ファイル名を作成することができます。 MFT を読み取り、アセンブルされた名前でCreateFileを呼び出すときにビルドされます。

CreateFile または OpenFileByID から SafeFileHandle にハンドルを取得します。

[DllImport( "kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode )]
internal static extern SafeFileHandle CreateFile( string lpFileName, EFileAccess dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile );

[DllImport( "kernel32.dll", SetLastError = true )]
internal static extern SafeFileHandle OpenFileById( IntPtr volumeHandle, ref FileIdDescriptor lpFileId, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwFlagsAndAttributes );

SafeFileHandle を取得したら (そしてそれが有効であることを確認したら)、それを FileStream コンストラクターに渡し、通常どおりファイルを読み書きできます。

すべてのファイルは MFT で表されますが、注意事項があります。たとえば、単一のファイルが複数の場所のファイル階層に存在する可能性がありますが、すべてのファイルに対して 1 つの MFT エントリがあります。これらはいわゆるハード リンクです (コピーではありません。複数のエントリ ポイントがあります)。ファイル - 頭痛の種がたくさんあります)。これらは何千もあります。ハード リンクを調査するための API はありますが、見苦しくなります。

于 2015-04-11T14:09:35.677 に答える