繁体   English   中英

如何使用 C# .NET 3.5 解压缩 7z 存档?

[英]How to decompress a 7z archive with C# .NET 3.5?

我希望我的应用程序使用 .7z 文件中的文件。

我找到了一些关于如何解压缩 7z 文件的解释 然而,它们都是关于一个我在野外还没有遇到过的案例:一个解压为单个文件的存档。 我希望 .7z 存档解压缩为任意数量的文件,可能位于任意子文件夹中。

似乎可以通过包含整个 7zip 应用程序然后在进程中运行它来做到这一点。 但是,考虑到有官方 LZMA SDK ,这似乎是不必要的额外步骤。 此外,它会导致有关交叉兼容性的问题。

那么,如何使用 C# (.NET 3.5) 将 .7z 存档解压缩到给定文件夹中?

来自评论的附加信息

请出示无效的代码。
好吧,目前我正在另一个问题上使用这个答案的后半部分。 但是,我希望不要做我想做的事情 - output (就像input一样)是一个FileStream ,所以很明显这只会创建一个文件。
它表明Decoder是进行解压缩的类,但它没有一个方法可以与例如DirectoryInfostring路径或类似的东西一起使用 - 它都是一个文件输入,一个文件输出 我在使用 SDK 时发现的每个信息都做同样的事情; 我还没有找到一个将存档提取到多个文件的方法。

我得出以下结论:

将 .7z 存档解压缩到文件夹中不是 C# LZMA SDK 提供的功能。

恐怕我还没有找到任何确凿的证据,就像博客文章直接陈述的那样。

但是,我找到.7z文件格式的说明 这个描述没有提供足够的技术细节来制定一个有效的解决方案,但它包含了关于格式的某些事实:

在本节中,我将解释前面的示例如何存储在数据结构化 [...]

首先是 Header 它只包含两个变量: FileInfo 和 StreamsInfo。

FileInfo 可能是最容易理解的结构。 它包含 7z 中每个文件的名称和一些其他标志,用于定义文件实际上是目录还是文件是空文件。

据我所知,这种结构并没有反映在 C# SDK 的代码中。 结合Decoder.Code()方法不适用于目录路径或多个输出Stream是一个强有力的指标。

因此,LZMA SDK 的 C# 部分似乎只处理单个文件的加密和解密,或在链接文档中称为“压缩流”。 .7z存档格式然后算作一个单独的格式,它最终是一个包含任意数量压缩流的结构。

这些流实际上可以以任意方式组合; 例如,存档可以包含用 LZMA 压缩的文件 A 和 B,然后将文件 C 添加到混合中并使用另一种算法再次压缩它。 这使得解压缩.7z存档变得更加复杂,这使得 SDK 中没有提供此功能更加遗憾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM