При открытии файла нулевого размера boost::iostreams::mapped_file_source бросает исключение. Что с этим можно сделать?
Есть файл (текстовый). Пытаюсь его открыть, при помощи boost iostreams. Если файл содержит текст (хотя бы 1 символ) - открывается, без ошибок и без нареканий. Но если он пуст (т.е. без символов, std::filesystem::file_size(...) == 0), вылетает исключение "iostream stream error", "failed create mapping", следующего содержания:
RU: "Том для открытого файла был изменен извне, поэтому работа с этим файлом невозможна."
EN: "The volume of a file has been externally altered and open file is not longer valid."
Код примерно такой (суть идеи):
#include <stdio.h>
#include <filesystem>
#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/iostreams/stream.hpp>
using std::filesystem::path;
using boost::iostreams::mapped_file;
using boost::iostreams::mapped_file_params;
using boost::iostreams::mapped_file_source;
using boost::iostreams::stream;
void open_file(stream<mapped_file_source>& stream, std::filesystem::path){
if (stream.is_open())return;
const auto generic_string_path = path.generic_string();
mapped_file_params params(generic_string_path);
params.flags = mapped_file::mapmode::readonly;
params.length = file_size(path);
printf("Opening file %s\n", generic_string_path.c_str());
mapped_file_source file_source(params);
printf("Trying open\n");
(!(path.has_extension() && (path.extension() == "txt"))) ?
stream.open(file_source, std::ios::in | std::ios::binary) :
stream.open(file_source, std::ios::in);
printf("File %s is opened\n", generic_string_path.c_str());
}
Исключение вылетает при создании mapped_file_source.
Для сравнения, в точно такой же ситуации (при std::filesystem::file_size(...) == 0), std::ifstream ведёт себя приличнее: поток корректно открывается, пусть и ничего не содержит. Но stream<mapped_file_source> - увы, из-за того, что mapped_file_source бросает это исключение, не может быть открыт.
Ключевой вопрос: что с этим можно сделать, учитывая, что от stream<mapped_file_source> хотелось бы поведения схожего с ifstream, с тем различием, что stream<mapped_file_source> использует отображение файла в память?
P.S> Идеальным вариантом, было бы не просто конструировать поток для отображаемого в память файла, но и иметь возможность редактировать и заменять файл "на горячую" (что-нибудь с boost interprocess) - это при открытом в программе потоке - без вызова stream.close() (это, скорее, из разряда хотелок, прямого отношения к вопросу не имеет - скорее как пояснение контекста: у меня всё шаманство крутится в отдельном потоке, проверяет состояние загруженных данных [из файлов] и, если какой-либо файл обновился, обновляет соответствующие данные в памяти из этого файла - перезагружает их из него). Но главное, повторюсь, избежать исключения при открытии пустого файла - если это вообще возможно.