CreateFile()を呼び出しても、それ自体はターゲットファイルの内容をバッファリングしたり読み取ったりしません。CreateFile()を呼び出した後、ReadFile()を呼び出して、ファイルの最初のキロバイトを読み取るなど、ファイルの必要な部分を取得する必要があります。
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);
さらに、ファイルのランダムな部分を読み取りたい場合は、 ReadFile()を呼び出す前にSetFilePointer()を使用できます。たとえば、1メガバイトから始まる1キロバイトをファイルに読み取ります。
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);
もちろん、ファイルが開いている間は、SetFilePointer()とReadFile()を何度でも呼び出すことができます。ReadFile()を呼び出すと、ReadFile()によって読み取られた最後のバイトの直後のバイトにファイルポインタが暗黙的に設定されます。
さらに、使用するファイル管理関数のドキュメントを読み、戻り値を適切にチェックして、発生する可能性のあるエラーをトラップする必要があります。
Windowsは、その裁量により、使用可能なシステムメモリを使用して開いているファイルの内容をキャッシュできますが、実行中のプログラムでメモリが必要な場合、このプロセスによってキャッシュされたデータは破棄されます(結局、キャッシュされたデータは再読み取りできます)。必要に応じてディスクから)。