При открытии файла нулевого размера 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() (это, скорее, из разряда хотелок, прямого отношения к вопросу не имеет - скорее как пояснение контекста: у меня всё шаманство крутится в отдельном потоке, проверяет состояние загруженных данных [из файлов] и, если какой-либо файл обновился, обновляет соответствующие данные в памяти из этого файла - перезагружает их из него). Но главное, повторюсь, избежать исключения при открытии пустого файла - если это вообще возможно.


Ответы (0 шт):