2012-02-08 4 views
3

Я искал хороший, переносимый способ создания zip-файла на C++ и был близок. Я читал в разных местах, что его можно использовать Повысьте IOstream библиотеку, но я не могу найти исходный код или даже документацию на него в ссылке:Пример Boost IOStream для создания zip-файла?

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

ли кто-нибудь есть хороший Справка? Я сделал много Googling и не придумал много.

ответ

4

Не думаю, что boost :: iostreams может открыть почтовый файл. См. Unziping a zip file with boost and Visual C++ 2005.

boost :: iostreams может использоваться для сжатия потоков или отдельных файлов с использованием zlib, gzip или bzip2. Вы можете найти некоторые примеры здесь:

Однако, он не может читать информацию каталога внутри архива.

С другой стороны, вам необходимо скомпилировать boost с использованием сторонних библиотек: zlib и bzip2. См. installation information.

+1

Спасибо за объяснение. Вы можете подумать, что есть простой способ создать zip-файл портативно без большого количества кода. – Darkenor

1

Я написал простой 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

Например, вы можете создать почтовый файл с двумя файлами, делая

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; 
0

Это полезный streamclass для бесперебойной обработки zip-файлов!

Но будьте осторожны, что в файле ZIP.cpp есть небольшая ошибка, рассмотрим: Lines 191ff. прочитать

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))]; 

Так что, если вы собираетесь использовать этот класс, вы должны рассмотреть исправление этой ошибки. Это не хлопот.

Смежные вопросы