是否可以再次读取解压缩的文件?
想象一下我用了archive_read_next_header(a, &entry)
, 我使用archive_read_data(a, ptr_to_buffer, buffer_size)
读取了未知数量的字节.现在我想重置它并从头开始重新开始阅读。我试图覆盖seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which)
.我知道由于压缩算法的内部工作,可能不可能只在解压缩的数据内部寻找,并且除了 libarchive 内部缓冲区中有限数量的字节外,数据不会存储在任何地方。
这个想法是重置所有内容,并读取std::streamoff off
字节,这样我就可以创建向后搜索。前向搜索很容易,只需读取std::streamoff off
字节。它确实效率低下,但让我们希望,寻求不会被大量使用。
整个结构archive
是这样初始化的:
archive_read_set_read_callback(a, read_callback);
archive_read_set_callback_data(a, container);
archive_read_set_seek_callback(a, seek_callback);
archive_read_set_skip_callback(a, skip_callback);
int r = (archive_read_open1(a));
其中容器包含大部分std::istream
,回调是操作该流的函数。
我想实现的模板 `
std::streampos seek_beg(std::streamoff off) {
if(off >= 0) {
// read/skip 'off' bytes
} else {
// reset (a)
// read/skip 'off' bytes
}
// return position
}
'
我的 underflow() 方法是这样实现的: `
int underflow() {
int r = archive_read_data(ar, ptr, BUFFER_SIZE);
if (r < 0) {
throw std::runtime_error("ERROR");
} else if (r == 0) {
return std::streambuf::traits_type::eof();
} else {
setg(ptr, ptr, ptr + r);
}
return std::streambuf::traits_type::to_int_type(*ptr);
}
'
Libarchive 文档,更准确地说,GitHub 上 libarchive wiki 中的愿望清单说:
一些人要求能够有效地"重新阅读" 特定的存档条目。这是一个棘手的话题。对于许多人 格式,由此获得的性能收益将非常适中。为 例如,通过一点性能工作,寻求Zip阅读器可以 从一开始就支持非常快速的重读,因为它只涉及 重新解析中央目录。会有真实情况的情况 收益(例如,焦油.gz)将很难处理。这 最有可能的实现是某种形式的检查点,以便 客户端可以显式请求检查点对象,然后还原 回到那个检查点。检查点对象可能很复杂,如果 在格式处理程序中具有一系列堆叠读取筛选器以及状态 本身。
正如我所看到的,在libarchive的帮助下寻找现在是不可能的,所以解决我的问题的方法是,只有在我怀疑我想重新读取它时才记住所有读取的数据,或者将其推回流。