我使用Boost 1.62将文件映射到内存boost/iostreams/device/mapped_file.hpp
它适用于大多数文件,但某些文件会导致程序崩溃。我使用的是Windows 10 x64系统,文件如NTUSER.DAT.LOG
,但我可以使用编辑器打开它们并查看内容。
以下是我用来打开文件的代码:
uint64_t read_directory(char* in_path) {
struct _stat64 fileinfo;
const char* filename;
int result;
int counter = 0;
boost::iostreams::mapped_file_source file;
for (auto it : recursive_directory_range(in_path)) {
string filename_s = it.path().string();
filename = filename_s.c_str();
result = _stat64(filename, &fileinfo);
// cout << result << endl;
if (boost::filesystem::is_directory(it) || fileinfo.st_size == 0) {
continue;
}
if (boost::filesystem::is_regular_file(it)) {
file.open(filename, numberOfBytes);
}
if (file.is_open()) {
int* data = (int*)file.data();
file.close();
}
counter++;
if (counter % 1000 == 0) {
cout << counter << endl;
}
}
递归步行从这里开始: How do you iterate through every file/directory recursively in standard C++?
尝试访问此特定文件后,程序在调试器中崩溃并显示以下消息:
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::ios_base::failure> > at memory location 0x0000004529D2F118.
该程序以具有管理员权限的用户身份运行,但这应该不是问题,因为在Notepad ++中打开显示文件内容。我做错了什么?
编辑:我认为当另一个进程正在使用该文件时可能会有一些事情要做。我用gpodder试了一下,当它打开时,我无法映射文件。关闭程序后,我可以再次执行此操作。有没有办法事先检查一下?