Я использую mapped_file_source
из boost::iostreams
namespace
для чтения большого файла по частям:
boost::iostreams::mapped_file_source read_bytes(const char *file_path,
unsigned long long int offset,
unsigned long long int length) {
iostreams::mapped_file_params parameters;
parameters.path = file_path;
parameters.length = static_cast<size_t>(length);
parameters.flags = iostreams::mapped_file::mapmode::readonly;
parameters.offset = static_cast<boost::iostreams::stream_offset>(offset);
boost::iostreams::mapped_file_source file;
file.open(parameters);
if (file.is_open()) {
return file;
} else {
printf("Failed to open file\n");
exit(EXIT_FAILURE);
}
}
Мой код отлично работает для Ubuntu
в WSL
(Windows Subsystem for Linux
), но когда я компилирую и запускаю его в Windows, 2-й вызов file.open
заставляет процесс завершиться с кодом выхода 3
.
Reading file in 5 parts
Processing chunk 1/5
Processing chunk 2/5
Process finished with exit code 3
Никаких сообщений об ошибках или исключениях не было.Документация предполагает, что это будет ERROR_PATH_NOT_FOUND
, но это не имеет смысла.
Я отладил оба бинарных файла платформы, и все переменные были абсолютно идентичны, единственное исключение - путь к файлу в стиле Unix
и путь в стиле Windows
, а также выделенные адреса и системные временные переменные, поэтому повреждения памяти не произошло.Я не понимаю, почему это не работает на Windows
, когда он должен вести себя одинаково.
Я использую MinGW
для компиляции для Windows
и gcc 8.2
вUbuntu
.
"C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin\x86_64-w64-mingw32-gcc.exe" --version
x86_64-w64-mingw32-gcc.exe (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Если я читаю файл за один раз, он отлично работает (!).Я выравниваю все смещения по размеру страницы.mapped_file_source
автоматически закрывается, когда выпадает из области видимости, поэтому это не проблема «файл уже открыт» (это может вызвать исключение на Boost
).