.NET으로 7-Zip 아카이브를 생성하려면 어떻게합니까?
내 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 아카이브를 만드는 것을 보여줍니다. 일반 7zip 프로그램?
- 7-Zip 아카이브 DLL 용 CodeProject C # (. NET) 인터페이스 -7zip 아카이브에서 추출 만 지원합니다. 생성해야합니다!
- SharpZipLib - FAQ 에 따르면 SharpZipLib은 7zip을 지원하지 않습니다.
7-zip 앱이 모든 대상 컴퓨터에 설치되고 경로에 설치된다는 것을 보장 할 수있는 경우 명령 줄 앱 7z를 호출하여 오프로드 할 수 있습니다. 가장 우아한 솔루션은 아니지만 최소한의 작업입니다.
EggCafe 7Zip 쿠키 예제 DLL이 7Zip 인 예제 (zipping 쿠키)입니다.
CodePlex Wrapper 7z의 압축 기능을 워프하는 오픈 소스 프로젝트입니다.
7Zip SDK 7zip 용 공식 SDK (C, C ++, C #, Java) <--- 내 제안
SharpDevelop.net의 .Net zip 라이브러리
7zip을 사용한 CodeProject 예제
SharpZipLib 많은 압축
SevenZipSharp 는 또 다른 솔루션입니다. 7-zip 아카이브 생성 ...
다음은 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");
}
}
}
나는 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();
}
}
}
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을 설치하고 매개 변수를 메소드에 전달하십시오.
감사. 대답을 좋아하십시오.
I use this code
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();
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.
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
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
Install the NuGet package called SevenZipSharp.Interop
Then:
SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
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.
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
};
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)
참고URL : https://stackoverflow.com/questions/222030/how-do-i-create-7-zip-archives-with-net
'Programming' 카테고리의 다른 글
모델을 자동으로 마이그레이션하기 위해 Core Data를 얻으려면 어떻게해야합니까? (0) | 2020.08.26 |
---|---|
Roslyn이 코드를 컴파일하지 못했습니다. (0) | 2020.08.26 |
ES6 / Typescript에서 화살표 함수와 함께 _ (밑줄) 변수 사용 (0) | 2020.08.26 |
C #에서 IDisposable과 소멸자를 사용하는 것의 차이점은 무엇입니까? (0) | 2020.08.26 |
터치 장치의 jQuery UI 슬라이더 (0) | 2020.08.26 |