2013-10-20 187 views
3

服务器需要发送非常大的zip文件给客户端。压缩文件不能完全保存在内存中(太大)或写入磁盘(同时发送的多个文件可能对硬盘太大) - 必须将其直接流式传输到客户端。缓存的压缩流C++

对此的任何简单approadaces?从我收集的zip格式的标题中有一个CRC,因此如果没有完整地创建压缩文件,实际上不能实现压缩文件的压缩... 如果无法使用zip文件进行压缩,请建议其他格式。谢谢。

+0

我想这个提交给谷歌的问题的标题是相当丰富的。 – WhozCraig

+0

我在20分钟的搜索中找不到这个问题的直接答案。有很多解决方案不适合我的情况,因为它们要么将压缩文件保存在内存中,要么创建一个临时zip文件。我认为这个问题和它的答案将有一些价值,如果张贴在计算器上。 – s0li

回答

3

您可以使用POCO提供Inflate/Deflate流:

此流压缩使用zlib的的 deflate算法穿过它的所有数据。在所有数据写入流之后,必须调用 close()以确保完成压缩。

std::ofstream ostr("data.gz", std::ios::binary); 
DeflatingOutputStream deflater(ostr, DeflatingStreamBuf::STREAM_GZIP); 
deflater << "Hello, world!" << std::endl; 
deflater.close(); 
ostr.close(); 

您可以重定向ostr您的TCP流。

+0

但它在内存中创建zip,不是吗?如果它不怎么控制内存缓冲区的大小? – s0li

+0

它在内存(缓冲区)中部分创建zip,并将缓冲的部分写入流中。您可以通过控制输出流的'streambuf'来管理缓冲区。你也可以用另一个你可以控制的输出流来代替'ofstream'。 – deepmax

+0

请注意,这是一个GZ文件,与ZIP相似,但不相同 - 例如,您不能在GZ内发送多个文件。 – StilesCrisis