如何打开和关闭一个boost iostreams设备?

How do I handle opening and closing a boost iostreams Device?

本文关键字:一个 boost iostreams 设备 何打开      更新时间:2023-10-16

我已经定义了一个名为ZipFileDevice的boost Device,它接受一个存档路径,以及该存档中文件的路径。

Device定义了read, write, seek,一个接受两条路径的构造函数和一个析构函数。

我在ZipFileDevice的构造函数中打开zip文件,并在析构函数中关闭它。

我是这样使用设备的:

boost::iostreams::stream_buffer<ZipFileDevice> kBuff("path/to/archive", "path/to/file");
std::iostream kStream(&kBuff);
kStream.read(...);

我的问题是ZipFileDevice在创建stream_buffer时被复制两次,并且副本被销毁,关闭zip文件。当我从流中读取时,文件已经关闭。

如何正确处理打开和关闭设备?

从设计原理页:

过滤器和设备必须是CopyConstructible 或者通过boost::ref 传递到流和流缓冲区。

这个要求会使Filters和Devices的设计复杂化,因为一些本来不可复制的组件必须使用引用计数

模板basic_file就是一个很好的例子。Boost的预发布版本。Iostreams允许动态分配的过滤器和设备作为指针传递给流和流缓冲区,这些指针将由Iostreams库根据用户的选择拥有。这种设计被拒绝有两个原因:它不是异常安全的,并且它需要一个额外的函数参数来指示对象是否为库所有。

因此,要么将boost::ref传递到您的设备,要么实现句柄/正文习语,例如在您的Device类型

中使用shared_ptr<DeviceImpl>