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

时间:2019-05-17 17:05:39

标签: c# .net-3.5 7zip lzma

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

我找到了how to decompress a 7z file的一些解释。但是,它们都是关于我尚未在野外遇到的一种情况:将压缩文件解压缩为单个文件的档案。我希望.7z归档文件可以解压缩为任意数量的文件,可能在任意子文件夹中。

似乎including the whole 7zip application and then running that in a process可以做到这一点。但是,考虑到有一个official LZMA SDK,这似乎是不必要的额外步骤。此外,这还会导致有关交叉兼容性的问题。

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

评论中的其他信息

请显示无效的代码。
好吧,目前我在另一个问题上使用this answer的后半部分。但是,我期望不要执行我想要的操作-output(就像input一样是FileStream,因此很明显,这只会创建一个文件。
它表明Decoder是执行解压缩的类,但是它没有可与例如DirectoryInfostring路径之类的东西-都是一个文件输入,一个文件输出。我发现使用SDK的每条信息都做同样的事情。我还没有找到一个将存档提取到多个文件的文件。

1 个答案:

答案 0 :(得分:0)

我得出以下结论:

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

恐怕我没有发现任何确凿的证据,例如直接发表博客文章的证据。

但是,我发现了a description of the .7z file format。此说明没有提供足够的技术细节来制定可行的解决方案,但其中包含有关格式的某些事实:

  

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

中      

首先是标题,它仅包含两个变量:FileInfo和StreamsInfo。

     

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

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

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

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