使用Boost IOStream创建zip文件的示例?

8

我一直在寻找一个好的、便携式的方法来在C++中创建zip文件,但一直没有成功。我在各种地方都看到过使用Boost IOstream库的可能性,但是在参考文献中我找不到任何源代码或甚至文档:

http://www.boost.org/doc/libs/1_48_0/libs/iostreams/doc/index.html

有没有什么好的参考资料?我已经做了很多谷歌搜索,但没有找到太多有用的信息。

4个回答

9
我认为boost::iostreams无法打开zip文件。 参见使用boost和Visual C++ 2005解压缩zip文件的内容。
可以使用boost::iostreams来使用zlib,gzip或bzip2压缩流或单个文件。您可以在此处找到一些示例: 但是,它不能读取zip文件中的目录信息。
另外,您需要使用第三方库(zlib和bzip2)编译boost。请参见安装信息

2
感谢您的解释。你应该认为有一种简单的方法来创建一个可移植的zip文件,而不需要大量的代码。 - Darkenor

4
我写了一个简单的zip文件制作器,可以与iostreams一起使用。它包含在partio库中。 https://github.com/wdas/partio/blob/master/src/lib/io/ZIP.h https://github.com/wdas/partio/blob/master/src/lib/io/ZIP.cpp 例如,您可以通过以下方式创建包含两个文件的zip文件:
ZipFileWriter zip("foo.zip");
std::ostream* o = zip.Add_File("test.txt");
*o << "look a zip file" << std::endl;
delete o;
std::ostream* o2 = zip.Add_File("test2.txt");
*o2 << "look another file" << std::endl;
delete o2;

然后可以通过执行以下操作来读取文件

ZipFileReader zip("foo.zip");
std::istream* i = zip.Get_File("test.txt");
std::string foo;
*i >> foo;
std::cout << foo << std::endl;
delete i;

3
也许它不是一个zip文件,而是一个压缩文件,如果这样可以帮助您的意图。实际上,我已经测试过了:
#include <fstream>
#include <sstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

TEST(MyTests, SaveZipFile)
{
    using namespace std;

    ofstream file("a.z", ios_base::out | ios_base::binary);
    boost::iostreams::filtering_streambuf<boost::iostreams::output> out;
    out.push(boost::iostreams::zlib_compressor());
    out.push(file);

    stringstream sstr{"nihao"};


    boost::iostreams::copy(sstr, out);
}

TEST(MyTests, OpenZipFile)
{
    using namespace std;
    ifstream file("a.z", ios_base::in | ios_base::binary);
    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    in.push(boost::iostreams::zlib_decompressor());
    in.push(file);

    stringstream sstr;
    boost::iostreams::copy(in, sstr);
    cout << sstr.str() << endl;
    ASSERT_EQ(sstr.str(), string("nihao"));
}

0
这是一个用于无缝处理zip文件的有用的流类!但要注意,ZIP.cpp文件中有一个小错误,请考虑:191行及之后的内容。
char* buf=new char[std::max(comment_length,std::max(filename_length,extra_length))];
istream.read(buf,filename_length);
buf[filename_length]=0;

这忽略了缓冲区需要一个额外的字符空间来存放终止符(第193行),可能破坏堆!因此,第191行应该改为

char* buf=new char[std::max(comment_length,std::max(static_cast<unsigned short>(filename_length+1),extra_length))];

所以,如果你要使用这个类,你应该考虑修复这个 bug。这很容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接