Вызов 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);
Кроме того, если вы хотите прочитать случайную часть файла, вы можете использовать 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);
Разумеется, вы можете вызывать SetFilePointer () и ReadFile () столько раз, сколько пожелаете, пока файл открыт. Вызов ReadFile () неявно устанавливает указатель файла на байт, непосредственно следующий за последним байтом, прочитанным ReadFile ().
Кроме того, вам следует прочитать документацию по используемым функциям управления файлами , которую вы используете, и соответствующим образом проверить возвращаемые значения, чтобы отследить любые ошибки, которые могут возникнуть.
Windows может, по своему усмотрению, использовать доступную системную память для кэширования содержимого открытых файлов, но данные, кэшированные этим процессом, будут отбрасываться, если память требуется работающей программе (в конце концов, кэшированные данные могут быть просто перечитайте с диска, если это необходимо).