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 はありますが、見苦しくなります。