调用CreateFile()本身不会缓冲或读取目标文件的内容。在调用 CreateFile() 之后,您必须调用ReadFile()来获取您想要的文件的任何部分,例如读取文件的第一个 KB:
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 KB 到文件中:
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 可以自行决定使用可用的系统内存来缓存打开文件的内容,但是如果正在运行的程序需要内存,则该进程缓存的数据将被丢弃(毕竟,缓存的数据只能重新读取)如果需要,请从磁盘中获取)。