boostfiltering_istream gzip_decompressor 未压缩文件大小

Dan*_*Dan 3 c++ boost gzip

我正在使用 boost 过滤流对象来读取 gzipped 文件。效果很好!我想显示已处理文件量的进度条。我需要找到输入的未压缩文件大小。gzip 解压器是否可以访问 gzip 文件中的原始文件大小?我在boost gzip_decompressor 参考页面上找不到它。真的进度对话框是目标,是否有另一种方法来确定压缩文件中的位置?

    // gets compressed file size, need uncompressed size
    boost::uintmax_t fs = boost::filesystem::file_size (
        boost::filesystem::path (fname)
        );

    std::ifstream file (fname, std::ios_base::in | std::ios_base::binary);
    boost::iostreams::filtering_istream in;
    in.push (boost::iostreams::gzip_decompressor());
    in.push (file);

    std::string line;
    size_t bytes_read = 0;
    while (in)
    {
        std::getline (in, line);
        bytes_read += line.size ();
        // progress dlg with bytes_read / uncompressed size
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*Hay 5

您所追求的信息肯定存在(未压缩的数据大小记录在 gzip 文件的最后 4 个字节中,(请参阅GZIP 规范),但查看 boost 库的标头(见此处),它不会在任何地方公开。似乎唯一需要查看的地方是在进行检查以确保 read_footer 中没有损坏时。您可以自己直接从文件中读取值(只需将最后 4 个字节组合成一个 int,注意它们的订购(再次参见 GZIP 规范)),或使用不同的库进行解压缩。

  • 或者,您可以修改 boost 以添加此信息并为其提交补丁。然后每个人都从工作中受益。 (8认同)