我想链接多个流操作(例如下载文件,动态解压缩,以及处理没有任何临时文件的数据)。这些文件是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()将自动使&跳过那个文件。
可以进行类似的构造以进行压缩。示例用法 - 对非常大量的数据进行一些聚合 - 对于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;
}
}
答案 0 :(得分:0)
压缩时指定的基础算法和参数决定了所使用的块的大小,并且无法确保在解码块时它们落在字/行边界。因此,您必须在处理之前完全解压缩文件。
你要做的是可能在没有临时文件的情况下是不可能的 - 它真正依赖的是你是否有足够的内存来保持解压缩文件通过MemoryStream打开,执行所有处理和然后将内存释放回池中。进一步使这一点复杂化的是(重复进程内存)碎片,你可能会反复这样做。