如何使用 .NET 创建 7-Zip 存档?
如何从 C# 控制台应用程序创建 7-Zip 存档? 我需要能够使用常规的、广泛使用的 7-Zip 程序来提取档案。
以下是我的结果以及作为“Shelling out”to 7z.exe 问题的答案提供的示例
- - 这是最简单且最有效的方法,并且我可以确认它运行良好。 正如 workmad3 提到的,我只需要保证7z.exe安装在所有目标机器上,这是我可以保证的。
- 7Zip 内存压缩< /a> - 这是指在发送到客户端之前在“内存中”压缩cookie; 这种方法似乎有些前途。 包装器方法(包装 LZMA SDK)返回类型
byte[]. 当我将
byte[]
数组写入文件时,无法使用 7-Zip 提取它(File.7z 不支持存档
)。 - 7zSharp 包装器(在 CodePlex 上找到) - 这包装了 7z exe/LZMA SDK。 我从我的应用程序引用了该项目,它成功创建了一些存档文件,但我无法使用常规 7-Zip 程序提取文件(
File.7z 不支持存档
)。 - 7Zip SDK aka LZMA SDK - 我想我不够聪明,无法弄清楚如何使用这个(这就是我在这里发布的原因)...任何演示创建能够由常规 7zip 程序提取的 7zip 存档的工作代码示例?
- 7-Zip 存档 DLL 的 CodeProject C# (.NET) 接口 - 仅支持解压来自 7zip 档案...我需要创建它们!
- SharpZipLib - 根据他们的 常见问题解答,SharpZipLib 不支持 7zip。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
EggCafe 7Zip cookie 示例< /a> 这是一个带有 7Zip DLL 的示例(压缩 cookie)。
CodePlex 包装器
这是一个开源项目,对 7z 的压缩功能进行扭曲。
7Zip SDK 7zip 的官方 SDK(C、C++、C#、Java)<- --我的建议
.Net zip 库 SharpDevelop.net
CodeProject 7zip 示例
SharpZipLib 许多压缩
EggCafe 7Zip cookie example This is an example (zipping cookie) with the DLL of 7Zip.
CodePlex Wrapper
This is an open source project that warp zipping function of 7z.
7Zip SDK The official SDK for 7zip (C, C++, C#, Java) <---My suggestion
.Net zip library by SharpDevelop.net
CodeProject example with 7zip
SharpZipLib Many zipping
如果您可以保证 7-zip 应用程序将安装在所有目标计算机上(并位于路径中),您可以通过调用命令行应用程序 7z 来卸载。 这不是最优雅的解决方案,但它是最少的工作。
If you can guarantee the 7-zip app will be installed (and in the path) on all target machines, you can offload by calling the command line app 7z. Not the most elegant solution but it is the least work.
SevenZipSharp 是另一种解决方案。 创建 7-zip 档案...
SevenZipSharp is another solution. Creates 7-zip archives...
以下是在 C# 中使用 SevenZip SDK 的完整工作示例。
它将写入和读取由 Windows 7zip 应用程序创建的标准 7zip 文件。
附言。 前面的示例永远不会解压缩,因为它从未将所需的属性信息写入文件的开头。
Here's a complete working example using the SevenZip SDK in C#.
It will write, and read, standard 7zip files as created by the Windows 7zip application.
PS. The previous example was never going to decompress because it never wrote the required property information to the start of the file.
我用的是sdk。
例如:
I used the sdk.
eg:
只需从源安装 7 zip 并将参数传递给方法即可。
谢谢。 请喜欢这个答案。
Just Install 7 zip from source and pass the parameter to the method.
Thanks. Please like the answer.
我用这个代码
I use this code
使用 17.9MB 文本文件对 @Orwellophile 代码进行一些额外的测试信息。
“按原样”使用代码示例中的属性值将对性能产生巨大的负面影响,需要 14.16 秒。
将属性设置为以下内容在 3.91 秒 内完成相同的工作(ia 存档将具有相同的容器信息:您可以使用 7zip 提取并测试存档,但没有文件名信息
) 7zip 2 秒。
我使用本机 7zip 和 1,2GB SQL 备份文件 (.bak) 进行了另一项测试
7zip(最大压缩):1 分钟
LZMA SDK(@Orwellophile 具有上述属性设置):12:26 分钟 :-(
输出文件大小大致相同。
所以我想我自己会使用基于 c/c++ 引擎的解决方案,ia 要么从 c# 调用 7zip 可执行文件,要么使用 squid-box/SevenZipSharp,它是 7zip c/c++ dll 文件的包装器,似乎是 SevenZipSharp 的最新分支。
尚未测试包装器,但我希望其性能与本机 7zip 一样。 但希望它能够提供压缩流的可能性,如果直接调用 exe,您显然无法压缩流。 否则我想与调用 exe 相比并没有太大的优势。 包装器有一些其他依赖项,因此它不会使您发布的项目“更干净” ”。
顺便说一句,.Net Core 团队似乎考虑在 .Core 版本的 system.io 类中实现 LZMA。 5、那太好了!
(我知道这是一种评论,而不是答案,但为了能够提供代码片段,它不能是评论)
Some additional test-info on @Orwellophile code using a 17.9MB textfile.
Using the property values in the code-example "as is" will have a HUGE negative impact on performance, it takes 14.16 sec.
Setting the properties to the following do the same job at 3.91 sec (i.a. the archive will have the same container info which is: you can extract and test the archive with 7zip but there are no filename information)
Native 7zip 2 sec.
I did another test using native 7zip and a 1,2GB SQL backup file (.bak)
7zip (maximum compression): 1 minute
LZMA SDK (@Orwellophile with above property-setting): 12:26 min :-(
Outputfile roughly same size.
So I guess I'll myself will use a solution based on the c/c++ engine, i.a. either call the 7zip executable from c# or use squid-box/SevenZipSharp, which is a wrapper around the 7zip c/c++ dll file, and seems to be the newest fork of SevenZipSharp.
Haven't tested the wrapper, but I hope is perform just as the native 7zip. But hopefully it will give the possibility to compress stream also which you obvious cannot if you call the exe directly. Otherwise I guess there isn't mush advantage over calling the exe. The wrapper have some additional dependencies so it will not make your published project "cleaner".
By the way it seems the .Net Core team consider implementing LZMA in the system.io class in .Core ver. 5, that would be great!
(I know this is kind of a comment and not an answer but to be able to provide the code snippet it couldn't be a comment)
SharpCompress 在我看来是最智能的压缩库之一。 它支持 LZMA (7-zip),易于使用并且正在积极开发中。
由于它已经支持 LZMA 流,不幸的是,在撰写本文时,它仅支持 7-zip 存档读取。 但是归档写入在他们的待办事项列表中(请参阅自述文件)。 对于未来的读者:请在此处检查以获取当前状态:https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md
SharpCompress is in my opinion one of the smartest compression libraries out there. It supports LZMA (7-zip), is easy to use and under active development.
As it has LZMA streaming support already, at the time of writing it unfortunately only supports 7-zip archive reading. BUT archive writing is on their todo list (see readme). For future readers: Check to get the current status here: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md
安装名为
SevenZipSharp.Interop
的 NuGet 包然后:
Install the NuGet package called
SevenZipSharp.Interop
Then:
最简单的方法是使用 .zip 文件而不是 .7z,并
在分离 7zip 命令时 使用 Dot Net Zip外壳还有其他问题,例如用户权限,我在 SevenZipSharp 上遇到了问题。
These easiest way is to work with .zip files instead of .7z and use Dot Net Zip
When spinning off 7zip commands to shell there are other issues like user privileges, I had issue with SevenZipSharp.
这里是创建和解压 7zip 的代码(基于 LZMA SDK - C#)
注意:使用相同代码创建的 7z 存档可以取消存档。 由于代码使用托管 LZMA,且使用早期版本的 LZMA SDK
Here is code to create and extract 7zip (based on LZMA SDK - C#)
Note: 7z archives created with same code can be unarchived. As code uses managed LZMA using earlier version of LZMA SDK