读二进制文件,而整个文件缓存到内存中C ++(Reading binary files withou

2019-08-01 18:42发布

为了使二进制比较器我想在使用CreateFileW功能两个文件的二进制内容阅读。 但是,导致要bufferred到内存中的整个文件,并且成为大(500MB)的文件有问题。

我环顾四周,那将让我缓冲区,而不是文件的一部分等功能,但我还没有发现任何文件,明确阐明如何缓冲适用于那些功能(我在这是一个有点新的,所以也许我“M缺少明显)。

到目前为止,我似乎是最佳匹配所发现的是ReadFile的。 它似乎有一个定义的缓冲区,但我不能完全肯定不会有幕后实现,如存在与CreateFileW另一个缓冲区。

难道你们有什么会是一个很好的功能,使用任何输入?

Answer 1:

你可以使用内存映射文件来做到这一点。 与打开createFile ,采用createFileMapping然后MapViewOfFile得到的指针数据。



Answer 2:

不知道你的意思通过的CreateFile缓冲 - 的CreateFile不会在文件的全部内容读出,而且,你需要调用的CreateFile后,才能调用ReadFile的。

ReadFile的会做你想要什么 - 操作系统可能会做一些预先读取数据的opportunisticly缓存数据,但它不会在读取整个500 MB的文件。

如果你真的想有没有缓冲,通过FILE_FLAG_NO_BUFFERING到的CreateFile,并确保您的文件访问量是扇区大小的倍数。 我强烈建议你不这样做 - 的存在是有原因的系统文件缓存,并表现帮助。 在内存缓存文件应该对整个系统的内存使用没有任何影响 - 内存压力下的系统文件缓存会缩水。

正如其他人所说,你可以使用内存映射文件也是如此。 内存之间的差异映射文件和ReadFile的主要是公正的接口 - 最终的文件管理器将满足以类似的方式的要求,其中包括一些缓冲。 该接口似乎有点更直观,但要知道,这将导致异常,将需要捕获否则将你的程序崩溃发生的任何错误。



Answer 3:

调用的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可能会根据自己的判断,使用可用的系统内存来缓存打开文件的内容,但这个过程中缓存的数据将被丢弃,如果是由一个运行程序所需的内存(毕竟,缓存的数据正好可以重新读取从盘面如果需要的话)。



Answer 4:

我相信你想MapViewOfFile 。



文章来源: Reading binary files without buffering the whole file into memory in C++