为了使二进制比较器我想在使用CreateFileW功能两个文件的二进制内容阅读。 但是,导致要bufferred到内存中的整个文件,并且成为大(500MB)的文件有问题。
我环顾四周,那将让我缓冲区,而不是文件的一部分等功能,但我还没有发现任何文件,明确阐明如何缓冲适用于那些功能(我在这是一个有点新的,所以也许我“M缺少明显)。
到目前为止,我似乎是最佳匹配所发现的是ReadFile的。 它似乎有一个定义的缓冲区,但我不能完全肯定不会有幕后实现,如存在与CreateFileW另一个缓冲区。
难道你们有什么会是一个很好的功能,使用任何输入?
你可以使用内存映射文件来做到这一点。 与打开createFile
,采用createFileMapping
然后MapViewOfFile
得到的指针数据。
不知道你的意思通过的CreateFile缓冲 - 的CreateFile不会在文件的全部内容读出,而且,你需要调用的CreateFile后,才能调用ReadFile的。
ReadFile的会做你想要什么 - 操作系统可能会做一些预先读取数据的opportunisticly缓存数据,但它不会在读取整个500 MB的文件。
如果你真的想有没有缓冲,通过FILE_FLAG_NO_BUFFERING到的CreateFile,并确保您的文件访问量是扇区大小的倍数。 我强烈建议你不这样做 - 的存在是有原因的系统文件缓存,并表现帮助。 在内存缓存文件应该对整个系统的内存使用没有任何影响 - 内存压力下的系统文件缓存会缩水。
正如其他人所说,你可以使用内存映射文件也是如此。 内存之间的差异映射文件和ReadFile的主要是公正的接口 - 最终的文件管理器将满足以类似的方式的要求,其中包括一些缓冲。 该接口似乎有点更直观,但要知道,这将导致异常,将需要捕获否则将你的程序崩溃发生的任何错误。
调用的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可能会根据自己的判断,使用可用的系统内存来缓存打开文件的内容,但这个过程中缓存的数据将被丢弃,如果是由一个运行程序所需的内存(毕竟,缓存的数据正好可以重新读取从盘面如果需要的话)。