.NET으로 7-Zip 아카이브를 생성하려면 어떻게합니까?


101

내 C # 콘솔 애플리케이션에서 7-Zip 아카이브를 생성하려면 어떻게해야합니까? 널리 사용되는 일반 7-Zip 프로그램을 사용하여 아카이브를 추출 할 수 있어야합니다 .


이 질문에 대한 답변으로 제공된 예제를 사용한 결과는 다음과 같습니다.

  • 7z.exe에 대한 "Shelling out"-이것은 가장 간단하고 효과적인 접근 방식이며 잘 작동 함을 확인할 수 있습니다 . workmad3에서 언급 했듯이 모든 대상 컴퓨터에 7z.exe가 설치되어 있는지 확인하기 만하면됩니다.
  • 7Zip in memory compression- 이것은 클라이언트로 보내기 전에 "인 메모리"쿠키를 압축하는 것을 의미합니다. 이 방법은 다소 유망 해 보입니다. 래퍼 메서드 ( 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을 지원하지 않습니다.

32
모든 링크가 아래 내 게시물에서 온 경우 Google에서 작성하지 마십시오. 의 사람들을별로 존중하지 않고 몇 가지 해결책을 찾는 데 시간이 걸렸습니다.
Patrick Desjardins

3
이 게시물이 오래되었다는 것을 알고 있지만 오늘 연구에서 SevenZipSharp라는 프로젝트를 보았습니다. sevenzipsharp.codeplex.com
Timmerz

12
미래의 독자를위한 경고의 한마디. SevenZipSharp는 포기한 것 같습니다. 오늘 현재 최신 안정 릴리스 (0.64)가 2010 년 8 월에 몇 가지 불쾌한 멀티 스레딩 문제와 함께 릴리스되었습니다 (버그 보고서에 따르면). 그 이후로 몇 개의 소스 코드 커밋 만 게시되었습니다.
Anttu

답변:


28

7-zip 앱이 모든 대상 컴퓨터에 설치되고 경로에 설치된다는 것을 보장 할 수있는 경우 명령 줄 앱 7z를 호출하여 오프로드 할 수 있습니다. 가장 우아한 솔루션은 아니지만 최소한의 작업입니다.


7
우리는 실제로 바이너리와 함께 7z 명령 줄 유틸리티를 제공하고 여기에 쉘 아웃합니다. 우리에게 정말 잘 작동합니다.
David Mohundro

79

EggCafe 7Zip 쿠키 예제 DLL이 7Zip 인 예제 (zipping 쿠키)입니다.

CodePlex Wrapper 7z의 압축 기능을 워프하는 오픈 소스 프로젝트입니다.

7Zip SDK 7zip 용 공식 SDK (C, C ++, C #, Java) <--- 내 제안

SharpDevelop.net의 .Net zip 라이브러리

7zip을 사용한 CodeProject 예제

SharpZipLib 많은 압축


완료하고 유용한 오픈 소스 프로젝트를 추가했습니다.
Patrick Desjardins

1
LOL? 문자열로 쿠키를 변경합니다 ... 파일 또는 기타 ... 롤?
Patrick Desjardins

1
아니요, 누군가가 실제 사례를 생각해 냈는지 확인하고 싶습니다 ... 조사해 주셔서 감사합니다.하지만 제공 한 링크 중 어느 것도 작동하는 것으로 연결되지 않았습니다.
Seibar

2
복사하여 붙여 넣을 수있는 코드가 없다는 데 동의해야합니다. SDK는 모든 답변을 제공하지만 제대로 작동하려면 시간과 노력이 필요합니다. 나는 당신이 그것을 원하지 않는다는 것을 이해할 수 있습니다. 좋은 하루 되세요.
Patrick Desjardins

3
어쨌든 SharpDevelop / SharpZipLib 참조는 모두 동일하게 참조하고 7-Zip을 지원하지 않기 때문에 제거하는 것이 좋습니다. Seibar는 7z를 명시 적으로 요청했습니다. ShaprZipLib가 아카이브와 함께 작동하지 않았고이 스레드를 찾았 기 때문에 7z 솔루션을 찾고 있습니다. ShaprZipLib은 잘못된 힌트입니다!
Onsokumaru 2018 년

25

SevenZipSharp 는 또 다른 솔루션입니다. 7-zip 아카이브 생성 ...


7
markhor의이 게시물은 실제로 SevenZipSharp 프로젝트의 제작자가 작성한 것입니다. SevenZipSharp는 7Zip dll에 대한 프로그래밍 방식 액세스를 허용하여 모든 기능을 제공합니다. LZMA SDK가 저수준이고 이해하기 어렵다는 것을 알았습니다. 대조적으로 SevenZipSharp는 문서화가 잘되어 있고 사용하기 쉬우 며 테스트 프로젝트에 많은 샘플 사용이 있습니다. 예제를 사용하면 파일이나 메모리를 사용하여 빠르게 압축하고 압축을 풀 수 있습니다.
John Wigger

4
SevenZipSharp는 버려진 것 같습니다. 질문에 대한 이전 의견을 참조하십시오.
Anttu 2015 년

SevenZipSharp는 느립니다. 현재 가장 권장되는 솔루션은 Process.Start ( "7z.exe ......)를 사용하는 것입니다.
klm_

24

다음은 C #에서 SevenZip SDK를 사용한 완전한 작업 예제입니다.

Windows 7zip 응용 프로그램에서 만든 표준 7zip 파일을 쓰고 읽습니다.

추신. 이전 예제는 파일 시작 부분에 필요한 속성 정보를 기록하지 않았기 때문에 압축을 풀지 않았습니다.

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

15
이것은 순수한 LZMA 압축 / 압축 해제입니다. 7zip 파일 형식은 파일 이름 / 경로 및 기타 파일 메타 데이터와 함께 여러 파일을 패키징 할 수있는 그 위에있는 레이어입니다.
redcalx

1
@redcalx가 정확합니다. 누구든지 상단 7zip 레이어를 처리하는 방법에 대한 단서가 있습니까? 다른 SO 게시물에 대한 언급은 훌륭한 :) 것
크리스토퍼 J 스미스

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

7
그리고 파일의 압축을 어떻게 풀까요? SevenZip.Compression.LZMA.Decoder를 사용하여 동일한 작업을 시도하고 Code (stream1, stream2, -1, -1, null); 프레임 워크에서 데이터 예외가 발생했습니다.
Karsten

3
 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을 설치하고 매개 변수를 메소드에 전달하십시오.

감사. 대답을 좋아하십시오.


이것은 7za.exe와 함께 Windows 서비스에서 나를 위해 일했습니다
Marco Duindam

1

이 코드를 사용합니다

                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

라는 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);

기존 7z 아카이브에 파일을 추가하려고 시도했지만 아카이브가 손상되었습니다.
Geograph

1

17.9MB 텍스트 파일을 사용하는 @Orwellophile 코드에 대한 추가 테스트 정보.
코드 예제의 속성 값을 "있는 그대로"사용하면 성능에 큰 부정적인 영향을 미치며 14.16 초가 걸립니다 .

속성을 다음과 같이 설정하면 3.91 초에 동일한 작업을 수행합니다 (아카이브는 동일한 컨테이너 정보를 갖게됩니다. 즉, 7zip으로 아카이브를 추출하고 테스트 할 수 있지만 파일 이름 정보는 없습니다).

기본 7zip 2 초

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 분 :-( 출력
파일 크기가 거의 동일합니다. .

그래서 나는 C / c ++ 엔진을 기반으로 한 솔루션을 사용할 것이라고 생각합니다. SevenZipSharp의 최신 포크입니다. 래퍼를 테스트하지는 않았지만 네이티브 7zip처럼 수행되기를 바랍니다. 그러나 바라건대 그것은 당신이 exe를 직접 호출하는 경우 명백히 할 수없는 스트림을 압축 할 수있는 가능성을 줄 것입니다. 그렇지 않으면 exe를 호출하는 것보다 큰 이점이 없다고 생각합니다. 래퍼에는 몇 가지 추가 종속성이 있으므로 게시 된 프로젝트를 "깨끗하게"만들지 않습니다.

그건 그렇고 .Net Core 팀은 .Core 버전의 system.io 클래스에서 LZMA를 구현하는 것을 고려하는 것 같습니다. 5, 좋을 것입니다!

(나는 이것이 일종의 주석이고 대답이 아니라는 것을 알고 있지만 코드 스 니펫을 제공 할 수 있다는 것은 주석 일 수 없습니다)


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

0

SharpCompress 는 제 생각에 가장 똑똑한 압축 라이브러리 중 하나입니다. LZMA (7-zip)를 지원하며 사용하기 쉽고 활발한 개발 중입니다.

이미 LZMA 스트리밍 지원이 있으므로 작성 당시에는 불행히도 7-zip 아카이브 읽기만 지원합니다. 그러나 아카이브 작성은 할 일 목록에 있습니다 (readme 참조). 향후 독자 : https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md 에서 현재 상태를 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.