web-dev-qa-db-ja.com

.NETで7-Zipアーカイブを作成するにはどうすればよいですか?

C#コンソールアプリケーションから7-Zipアーカイブを作成するにはどうすればよいですか?通常の広く利用可能な 7-Zip プログラムを使用してアーカイブを抽出できる必要があります。


この質問への回答として提供された例の私の結果はここにあります

  • 7z.exeへの「シェルアウト」-これは最も単純で最も効果的なアプローチであり、それがうまく機能することを確認できますworkmad3言及 のように、7z.exeがすべてのターゲットマシンにインストールされていることを保証する必要があるだけです。これは保証できます。
  • 7Zip in memory compression -これは、クライアントに送信する前に「メモリ内」で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プログラムで抽出できますか?
  • 7-ZipアーカイブDLLのCodeProject C#(.NET)インターフェイス -7Zipアーカイブからの抽出のみをサポートしています...それらを作成する必要があります!
  • SharpZipLib - [〜#〜] faq [〜#〜] によると、SharpZipLibは7Zipをサポートしていません。
95
Seibar

7-Zipアプリがすべてのターゲットマシンに(およびパスに)インストールされることを保証できる場合は、コマンドラインアプリ7zを呼び出してオフロードできます。最もエレガントなソリューションではありませんが、最も手間がかかりません。

29
workmad3

EggCafe 7Zip cookieの例 これは、7ZipのDLLを使用した例(cookieの圧縮)です。

CodePlex Wrapper これは、7zのzip圧縮機能をワープするオープンソースプロジェクトです。

7Zip SDK 7Zipの公式SDK(C、C++、C#、Java)<---私の提案

SharpDevelop.net による.Net Zipライブラリ

CodeProject 7Zipの例

SharpZipLib 多くの圧縮

76

SevenZipSharp は別のソリューションです。 7-Zipアーカイブを作成...

25
markhor

次に、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");
        }
    }
}
23
Orwellophile

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();
      }
   }
}
8
WOPR
 string zipfile = @"E:\Folderx\NPPES.Zip";
 string folder = @"E:\TargetFolderx";

 ExtractFile(zipfile,folder);
public void ExtractFile(string source, string destination)
        {
            // If the directory doesn't exist, create it.
            if (!Directory.Exists(destination))
                Directory.CreateDirectory(destination);

            //string zPath = ConfigurationManager.AppSettings["FileExtactorEXE"];
          //  string zPath = Properties.Settings.Default.FileExtactorEXE; ;

            string zPath=@"C:\Program Files\7-Zip\7zG.exe";

            try
            {
                ProcessStartInfo pro = new ProcessStartInfo();
                pro.WindowStyle = ProcessWindowStyle.Hidden;
                pro.FileName = zPath;
                pro.Arguments = "x \"" + source + "\" -o" + destination;
                Process x = Process.Start(pro);
                x.WaitForExit();
            }
            catch (System.Exception Ex) { }
        }

ソースから7 Zipをインストールして、パラメーターをメソッドに渡すだけです。

ありがとう。答えが好きです。

3
Vishal Sen

これらの最も簡単な方法は、.7zの代わりに.Zipファイルを使用して Dot Net Zip を使用することです

7Zipコマンドをシェルにスピンオフするとき、ユーザー特権のような他の問題があり、SevenZipSharpに問題がありました。

Private Function CompressFile(filename As String) As Boolean
Using Zip As New ZipFile()
    Zip.AddFile(filename & ".txt", "")
    Zip.Save(filename & ".Zip")
End Using

Return File.Exists(filename & ".Zip")
End Function
1
Brent

このコードを使用します

                string PZipPath = @"C:\Program Files\7-Zip\7z.exe";
                string sourceCompressDir = @"C:\Test";
                string targetCompressName = @"C:\Test\abc.Zip";
                string CompressName = targetCompressName.Split('\\').Last();
                string[] fileCompressList = Directory.GetFiles(sourceCompressDir, "*.*");

                    if (fileCompressList.Length == 0)
                    {
                        MessageBox.Show("No file in directory", "Important Message");
                        return;
                    }
                    string filetozip = null;
                    foreach (string filename in fileCompressList)
                    {
                        filetozip = filetozip + "\"" + filename + " ";
                    }

                    ProcessStartInfo pCompress = new ProcessStartInfo();
                    pCompress.FileName = PZipPath;
                    if (chkRequestPWD.Checked == true)
                    {
                        pCompress.Arguments = "a -tzip \"" + targetCompressName + "\" " + filetozip + " -mx=9" + " -p" + tbPassword.Text;
                    }
                    else
                    {
                        pCompress.Arguments = "a -tzip \"" + targetCompressName + "\" \"" + filetozip + "\" -mx=9";
                    }
                    pCompress.WindowStyle = ProcessWindowStyle.Hidden;
                    Process x = Process.Start(pCompress);
                    x.WaitForExit();
1
lifestylebyatom

SharpCompress は、私の意見では、最も賢い圧縮ライブラリの1つです。 LZMA(7-Zip)をサポートし、使いやすく開発が活発です。

すでにLZMAストリーミングをサポートしているため、執筆時点では、残念ながら7-Zipアーカイブの読み取りのみをサポートしています。ただし、アーカイブの書き込みはtodoリストに記載されています(readmeを参照)。将来の読者のために:ここで現在のステータスを確認してください: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md

0
Mario Eis

17.9MBのテキストファイルを使用した@Orwellophileコードに関する追加のテスト情報。
コード例のプロパティ値を「現状のまま」使用すると、パフォーマンスに大きな悪影響があります14.16秒

プロパティを次のように設定すると、3.91 secで同じジョブを実行します(つまり、アーカイブには同じコンテナ情報があります:を抽出してテストできます7Zipでアーカイブしますが、ファイル名情報はありません)

ネイティブ7Zip2秒

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
};

ネイティブの7Zipと1,2GBのSQLバックアップファイル(.bak)を使用して別のテストを行いました
7Zip(最大圧縮):1分
LZMA SDK(上記のプロパティ設定を使用した@Orwellophile):12:26 min:
出力ファイルはほぼ同じサイズです。

だから私は私自身がc/c ++エンジンに基づいたソリューションを使用すると思います。 c#から7Zip実行可能ファイルを呼び出すか、---(squid-box/SevenZipSharp を使用します。これは7Zip c/c ++ dllファイルのラッパーであり、SevenZipSharpの最新のフォークのようです。ラッパーをテストしていませんが、ネイティブ7Zipと同じように動作することを願っています。しかし、できれば、exeを直接呼び出した場合には明らかにできないストリームを圧縮する可能性が与えられることを願っています。それ以外の場合は、exeを呼び出すよりも利点はないでしょう。ラッパーには、いくつかの 追加の依存関係 があるため、公開されたプロジェクトが「クリーン」になりません。

ところで、.Net Coreチームは、.Core ver。のsystem.ioクラスにLZMAを実装することを検討しているようです。 5、それは素晴らしいことです!

(これは一種のコメントであり、回答ではないことを知っていますが、コードスニペットを提供できるようにするためにコメントにすることはできませんでした)

0
MrCalvin

SevenZipSharp.InteropというNuGetパッケージをインストールします

次に:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
0
Fidel