2012-02-07 134 views
3

我想压缩一堆文件,并通过数据流使数据消耗。DotNetZip流式传输

我想保持内存占用尽可能小。

我的想法是实现一个流,我有一堆FileStream对象作为数据成员。当我的Stream上的Read方法被调用时,我会从我的一个文件流中读取一些数据,并使用ZipOutputStream实例将压缩数据写入临时存储流,然后将该请求转发给临时存储流。

这个临时存储流只是一个字节队列。当这些字节被移入缓冲区(通过调用Read)时,它们将从队列中被删除。这样,我只能存储尚未读取的字节。

不幸的是,它似乎当我处置一个ZipOutputStream它需要写入随机文件位置以创建一个有效的zip文件。这将阻止我使用我的“短暂数据”解决方案。

但愿这一切清楚:)

有另一种方式创建压缩文件时,最大限度地减少内存占用?请帮忙!

谢谢!

回答

1

ZipOutputStream不需要写入输出流中的随机位置(换句话说,拨打Seek())。但是如果您正在写入的流报告它为CanSeek,它将使用该功能更新某些标题。

所以,请确保您正在写入的流返回falseCanSeek()并且一切都应该正常工作。

+0

您需要在ZipOutputStream上调用dispose()以使其生成有效的zip文件。如果不需要查找,那么dispose()会做什么? – Jordan 2012-02-07 20:46:36

+0

它与普通输出流类似:需要刷新缓冲区。它还会写入文件格式所需的页脚。 – svick 2012-02-07 21:02:26

+0

这大部分工作...现在我已经修复了所有的错误。它看起来像我被迫在Ionic.Zip.CountingStream中包装我的不可查找的流,以使其工作。任何想法为什么这是? – Jordan 2012-02-08 17:07:38