我想链接多个流操作(例如下载文件,动态解压缩它,并在没有任何临时文件的情况下处理数据)。文件为 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
}
每个文件流的行为就像一个表示一个文件的只读流,并且在主压缩流上调用 MoveNext() 将自动使该文件无效并跳过该文件。
可以为压缩完成类似的构造。示例用法 - 对非常大量的数据进行一些聚合 - 对于目录中的每个 7z 文件,对于其中的每个文件,对于每个文件中的每个数据行,总结一些值。
更新 2012-01-06
#ziplib (SharpZipLib) 已经使用
ZipInputStream
完成了我对 zip 文件的需求。类(class)。这是一个示例,该示例将所有文件作为给定 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;
}
}
最佳答案
压缩时指定的底层算法和参数决定了使用的块的大小,并且无法确保在您解码块时,它们落在字/行边界上。因此,您必须在处理之前完全解压缩文件。
如果没有临时文件,您要求做的事情可能是不可能的 - 它真正取决于您是否有足够的内存来通过 MemoryStream 保持解压缩文件打开,执行所有处理,然后将内存释放回池。进一步复杂化的是(进程内存的)碎片,您可能会导致重复执行此操作。
关于.net - 将 7z 文件视为 .NET 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3710961/