Yur*_*rik 11 .net compression 7zip stream
我想链接多个流操作(例如下载文件,动态解压缩,以及处理没有任何临时文件的数据).这些文件是7z格式.有一个LZMA SDK可用,但强制我创建一个外部输出流而不是一个流本身 - 换句话说,输出流必须完全写入才能使用它.SevenZipSharp似乎也缺少这个功能.
有没有人这样做过?
// in pseudo-code - CompressedFileStream derives from Stream
foreach (CompressedFileStream f in SevenZip.UncompressFiles(Web.GetStreamFromWeb(url))
{
Console.WriteLine("Processing file {0}", f.Name);
ProcessStream( f ); // further streaming, like decoding, processing, etc
}
Run Code Online (Sandbox Code Playgroud)
每个文件流的行为类似于表示一个文件的一次性读取流,并且在主压缩流上调用MoveNext()会自动使该文件无效并跳过该文件.
可以进行类似的构造以进行压缩.示例用法 - 对非常大量的数据进行一些聚合 - 对于dir中的每个7z文件,对于每个文件内部,对于每个文件中的每个数据行,总结一些值.
更新2012-01-06
#ziplib(SharpZipLib)已经完成了我需要的带有ZipInputStream类的zip文件.下面是一个示例,它将所有文件生成为给定zip文件中不可搜索的流.仍在寻找7z解决方案.
IEnumerable<Stream> UnZipStream(Stream stream)
{
using (var zipStream = new ZipInputStream(stream))
{
ZipEntry entry;
while ((entry = zipStream.GetNextEntry()) != null)
if (entry.IsFile)
yield return zipStream;
}
}
Run Code Online (Sandbox Code Playgroud)
压缩时指定的底层算法和参数决定了所使用的块的大小,并且无法确保在解码块时它们落在字/行边界处。因此,在处理之前您必须完全解压缩文件。
如果没有临时文件,您要求做的事情可能是不可能的 - 它真正取决于您是否有足够的内存来通过 MemoryStream 保持解压缩的文件打开,执行所有处理,然后将内存释放回池。使问题进一步复杂化的是(进程内存)碎片,您可能会导致重复执行此操作。