CreateFile()を呼び出すと、それ自体がターゲットファイルの内容をバッファしたり読み込んだりしません。あなたがランダムな部分を読みたい場合は、さらに
DWORD cbRead;
BYTE buffer[1024];
HANDLE hFile = ::CreateFile(filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
::ReadFile(hFile, sizeof(buffer), &cbRead, NULL);
::CloseHandle(hFile);
:のCreateFile()を呼び出した後、あなたは、例えば、ファイルの最初のキロバイトを読み取るために、あなたが好きなファイルの一部取得するReadFile()を呼び出す必要があります何回もあなたは、もちろん、呼び出しSetFilePointer()とのReadFile()
DWORD cbRead;
BYTE buffer[1024];
HANDLE hFile = ::CreateFile(filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
::SetFilePointer(hFile, 1024 * 1024, NULL, FILE_BEGIN);
::ReadFile(hFile, sizeof(buffer), &cbRead, NULL);
::CloseHandle(hFile);
:あなたは(ReadFile関数を呼び出す前にSetFilePointer()を使用することができるファイルは、)、例えばファイルに1メガバイトを開始する1キロバイトを読むにはファイルが開かれている間にあなたが望むように。 ReadFile()を呼び出すと、ファイルポインタがReadFile()によって最後に読み取られたバイトの直後のバイトに暗黙的に設定されます。
また、使用しているFile Management Functionsのマニュアルを読み、戻り値を適切にチェックして、発生する可能性のあるエラーをトラップする必要があります。
Windowsは、使用可能なシステムメモリを使用して開いているファイルの内容をキャッシュすることができますが、実行中のプログラムによってメモリが必要な場合、このプロセスによってキャッシュされたデータは破棄されます必要であればディスクから再読み込みしてください)。
なぜ 'CreateFile'がファイル全体をメモリにバッファリングすると思いますか? –
@pavelは良い点を持っていますCreateFileWはファイル全体をメモリにバッファリングしません。これは、ファイルのハンドルを作成するだけです。ハンドルを使用して、ファイル全体またはファイルの一部(選択内容)を読み取ることができます。 – leeeroy
あなたは正しいです。私が見ていたコードは、手動ですべてをメモリに格納していることに気付きました。したがって、巨大なフットプリントです。だからこれは、レガシーコード、grrを扱うように感じるものです... –