.net - 将 7z 文件视为 .NET 流

标签 .net stream 7zip compression

我想链接多个流操作(例如下载文件,动态解压缩它,并在没有任何临时文件的情况下处理数据)。文件为 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/

相关文章:

c# - 本地调试 - 云服务和 Service Fabric 与应用服务

c# - "?."运算符除了检查 null 之外还会做其他事情吗?

.NET 流功能 - CanXXX 测试安全吗?

java - 保持 Stream 打开有什么问题?

7zip 7za.exe - 不能使用绝对路径名

.net - Handlebars.net 使用 noEscape 选项禁用转义

c# - 带有 SOS 的 Windgb 不显示结构字段值

java - 具有独立消费者的单个 InputStream 的并发处理

c++ - 如何压缩文件夹使用 lzma sdk?

VB6(已编译)7Zip 命令行导致错误 10 ("The Array is Fixed or Temporarily Locked")