110

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


この質問への回答として提供された例を使用した私の結果は次のとおりです

  • 7z.exe への「砲撃」 - これは最も簡単で最も効果的なアプローチであり、うまく機能することを確認できます。workmad3 が言及しているように、すべてのターゲット マシンに 7z.exe がインストールされていることを保証する必要があるだけです。これは私が保証できることです。
  • 7Zip in memory 圧縮- これは、Cookie をクライアントに送信する前に「メモリ内」で圧縮することを指します。この方法はやや有望に思えます。ラッパー メソッド ( LZMA SDKをラップする) は type を返しbyte[]ます。配列をファイルに書き込むと、byte[]7-Zip ( ) を使用して配列を抽出できませんFile.7z is not supported archive
  • 7zSharp Wrapper (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 をサポートしていません。
4

12 に答える 12

82

EggCafe 7Zip cookieの例 7ZipのDLLを使った例(zip形式のcookie)です。

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

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

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

7zip を使用したCodeProject の

SharpZipLib多くの圧縮

于 2008-10-21T14:15:00.030 に答える
31

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

于 2008-10-21T14:18:42.020 に答える
25

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

于 2009-03-08T20:57:54.173 に答える
25

これは、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");
        }
    }
}
于 2012-01-08T07:01:20.850 に答える
8

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();
      }
   }
}
于 2008-12-15T04:45:31.470 に答える
1

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

それで:

SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
于 2018-12-22T14:53:14.733 に答える
0

これらの最も簡単な方法は、.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
于 2015-02-06T14:39:00.300 に答える
0

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

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

于 2016-10-26T18:13:48.430 に答える
0

7zip を作成して抽出するコードは次のとおりです (LZMA SDK - C# に基づく)

注: 同じコードで作成された 7z アーカイブはアーカイブ解除できます。コードは以前のバージョンの LZMA SDK を使用してマネージド LZMA を使用しているため

于 2021-04-28T10:23:25.043 に答える