当前位置:  开发笔记 > 编程语言 > 正文

如何使用.NET创建7-Zip压缩文件?

如何解决《如何使用.NET创建7-Zip压缩文件?》经验,为你挑选了5个好方法。

如何从C#控制台应用程序创建7-Zip存档?我需要能够使用常规的,广泛使用的7-Zip程序来提取档案.


以下是我的结果,提供的示例作为此问题的答案

"淘汰"到7z.exe - 这是最简单,最有效的方法,我可以确认它运行良好.正如workmad3所提到的,我只需要保证所有目标机器上都安装了7z.exe,这是我可以保证的.

7Zip内存压缩 - 这是指在发送给客户端之前"在内存中"压缩cookie; 这种方法似乎有点前途.包装器方法(包装LZMA SDK)返回类型byte[].当我将byte[]数组写入文件时,我无法使用7-Zip(File.7z is not supported archive)提取它.

7zSharp包装器(在CodePlex上找到) - 这包装了7z exe/LZMA SDK.我从我的应用程序引用了该项目,并成功创建了一些存档文件,但我无法使用常规的7-Zip程序(File.7z is not supported archive)提取文件.

7Zip SDK又名LZMA SDK - 我想我不够聪明,无法弄清楚如何使用它(这就是我在这里发布的原因)...任何工作代码示例,演示创建一个能够被提取的7zip存档常规7zip程序?

用于7-Zip存档DLL的CodeProject C#(.NET)接口 - 仅支持从7zip存档中提取...我需要创建它们!

SharpZipLib - 根据他们的FAQ,SharpZipLib不支持7zip.

Patrick Desj.. 76

EggCafe 7Zip cookie示例这是一个带有7Zip DLL的示例(压缩cookie).

CodePlex Wrapper 这是一个7z的warp压缩功能的开源项目.

7Zip SDK 7zip(C,C++,C#,Java)的官方SDK <---我的建议

SharpDevelop.net的 .Net zip库

使用7zip的CodeProject示例

SharpZipLib很多拉链



1> Patrick Desj..:

EggCafe 7Zip cookie示例这是一个带有7Zip DLL的示例(压缩cookie).

CodePlex Wrapper 这是一个7z的warp压缩功能的开源项目.

7Zip SDK 7zip(C,C++,C#,Java)的官方SDK <---我的建议

SharpDevelop.net的 .Net zip库

使用7zip的CodeProject示例

SharpZipLib很多拉链


我必须同意没有一个代码可以复制和粘贴.SDK是一个具有所有答案的SDK,但需要花费一些时间和精力才能使用一些东西.我能理解你不想这样做.祝你今天愉快.
无论如何,我建议删除SharpDevelop / SharpZipLib引用,因为这两个引用相同,并且它们不支持7-Zip。Seibar明确要求7z。我也在搜索7z解决方案,因为ShaprZipLib不适用于存档,并找到了该线程。ShaprZipLib是一个误导性提示!

2> workmad3..:

如果您可以保证将在所有目标计算机上安装(并且在路径中)7-zip应用程序,则可以通过调用命令行app 7z来卸载.不是最优雅的解决方案,但它是最不起作用的.


我们实际上将7z命令行实用程序与我们的二进制文件和shell一起发送给它.对我们来说真的很好.

3> markhor..:

SevenZipSharp是另一种解决方案.创建7-zip档案......


markhor的这篇文章实际上来自SevenZipSharp项目的创建者.SevenZipSharp允许以编程方式访问7Zip dll,使其功能非常全面.我发现LZMA SDK是低级的,难以理解.相比之下,SevenZipSharp具有良好的文档记录,易于使用,并且在其测试项目中具有许多样本用法.使用这些示例,我可以使用文件或内存快速压缩和解压缩.
SevenZipSharp似乎被抛弃了.请参阅我之前在问题中的评论.

4> Orwellophile..:

这是使用C#中的SevenZip SDK的完整工作示例.

它将编写和读取由Windows 7zip应用程序创建的标准7zip文件.

PS.前面的示例永远不会解压缩,因为它从未将所需的属性信息写入文件的开头.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SevenZip.Compression.LZMA;
using System.IO;
using SevenZip;

namespace VHD_Director
{
    class My7Zip
    {
        public static void CompressFileLZMA(string inFile, string outFile)
        {
            Int32 dictionary = 1 << 23;
            Int32 posStateBits = 2;
            Int32 litContextBits = 3; // for normal files
            // UInt32 litContextBits = 0; // for 32-bit data
            Int32 litPosBits = 0;
            // UInt32 litPosBits = 2; // for 32-bit data
            Int32 algorithm = 2;
            Int32 numFastBytes = 128;

            string mf = "bt4";
            bool eos = true;
            bool stdInMode = false;


            CoderPropID[] propIDs =  {
                CoderPropID.DictionarySize,
                CoderPropID.PosStateBits,
                CoderPropID.LitContextBits,
                CoderPropID.LitPosBits,
                CoderPropID.Algorithm,
                CoderPropID.NumFastBytes,
                CoderPropID.MatchFinder,
                CoderPropID.EndMarker
            };

            object[] properties = {
                (Int32)(dictionary),
                (Int32)(posStateBits),
                (Int32)(litContextBits),
                (Int32)(litPosBits),
                (Int32)(algorithm),
                (Int32)(numFastBytes),
                mf,
                eos
            };

            using (FileStream inStream = new FileStream(inFile, FileMode.Open))
            {
                using (FileStream outStream = new FileStream(outFile, FileMode.Create))
                {
                    SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
                    encoder.SetCoderProperties(propIDs, properties);
                    encoder.WriteCoderProperties(outStream);
                    Int64 fileSize;
                    if (eos || stdInMode)
                        fileSize = -1;
                    else
                        fileSize = inStream.Length;
                    for (int i = 0; i < 8; i++)
                        outStream.WriteByte((Byte)(fileSize >> (8 * i)));
                    encoder.Code(inStream, outStream, -1, -1, null);
                }
            }

        }

        public static void DecompressFileLZMA(string inFile, string outFile)
        {
            using (FileStream input = new FileStream(inFile, FileMode.Open))
            {
                using (FileStream output = new FileStream(outFile, FileMode.Create))
                {
                    SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();

                    byte[] properties = new byte[5];
                    if (input.Read(properties, 0, 5) != 5)
                        throw (new Exception("input .lzma is too short"));
                    decoder.SetDecoderProperties(properties);

                    long outSize = 0;
                    for (int i = 0; i < 8; i++)
                    {
                        int v = input.ReadByte();
                        if (v < 0)
                            throw (new Exception("Can't Read 1"));
                        outSize |= ((long)(byte)v) << (8 * i);
                    }
                    long compressedSize = input.Length - input.Position;

                    decoder.Code(input, output, compressedSize, outSize, null);
                }
            }
        }

        public static void Test()
        {
            CompressFileLZMA("DiscUtils.pdb", "DiscUtils.pdb.7z");
            DecompressFileLZMA("DiscUtils.pdb.7z", "DiscUtils.pdb2");
        }
    }
}


请注意,这是纯LZMA压缩/解压缩.7zip文件格式是一个上面的层,允许打包多个文件以及文件名/路径和其他文件metdata.

5> WOPR..:

我用的是sdk.

例如:

using SevenZip.Compression.LZMA;
private static void CompressFileLZMA(string inFile, string outFile)
{
   SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();

   using (FileStream input = new FileStream(inFile, FileMode.Open))
   {
      using (FileStream output = new FileStream(outFile, FileMode.Create))
      {
          coder.Code(input, output, -1, -1, null);
          output.Flush();
      }
   }
}


你将如何解压缩文件?我尝试使用SevenZip.Compression.LZMA.Decoder执行相同的操作并使用Code(stream1,stream2,-1,-1,null)调用它; 这给了框架数据异常.
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有