Как мне справиться с открытием и закрытием форсированного устройства iostreams?
Я определил устройство повышения с именем ZipFileDevice, которое принимает путь к архиву и путь к файлу в этом архиве.
Устройство определяет чтение, запись, поиск, конструктор, который принимает два пути, и деструктор.
Я открываю zip-файл в конструкторе ZipFileDevice и закрываю его в деструкторе.
Вот как я использую устройство:
boost::iostreams::stream_buffer<ZipFileDevice> kBuff("path/to/archive", "path/to/file");
std::iostream kStream(&kBuff);
kStream.read(...);
Моя проблема в том, что ZipFileDevice копируется дважды при создании stream_buffer, а копии уничтожаются, закрывая zip-файл. Когда я читал из потока, файл был закрыт.
Как правильно обрабатывать открытие и закрытие устройства?
1 ответ
Со страницы обоснования дизайна:
Фильтры и устройства должны быть
CopyConstructible
или передаваться в потоки и потоковые буферы, используяboost::ref
,Это требование может усложнить разработку фильтров и устройств, поскольку некоторые компоненты, которые в противном случае могли бы не копироваться, должны использовать подсчет ссылок.
Шаблон
basic_file
хорошая иллюстрация Предварительная версия Boost.Iostreams позволяла динамически распределенным фильтрам и устройствам передаваться в потоки и потоковые буферы в качестве указателей, которые стали бы принадлежать библиотеке Iostreams по выбору пользователя. Этот дизайн был отклонен по двум причинам: он не был безопасным для исключений, и для него требовался дополнительный параметр функции, чтобы указать, должен ли объект стать собственностью библиотеки.
Так что, либо пройти boost::ref
к вашему устройству или реализуйте идиому Handle/Body, например, с shared_ptr<DeviceImpl>
внутри вашего Device
тип