如何使用.NET创build7-Zip存档?
我如何从我的C#控制台应用程序创build7-Zip存档? 我需要能够使用普遍可用的7-Zip程序来提取档案。
这里是我提供的例子作为这个问题的答案的结果
- 对7z.exe“删除” – 这是最简单和最有效的方法,我可以确认它很好地工作 。 正如workmad3提到的 ,我只需要保证所有目标机器上都安装了7z.exe,这是我能保证的。
- 7压缩内存压缩 – 这是指在发送到客户端之前先压缩“内存中的”cookies; 这种方法似乎有些有前途。 包装方法(包装LZMA SDK )返回types
byte[]
。 当我将byte[]
数组写入文件时,我无法使用7-Zip(File.7z is not supported archive
)进行提取。 - 7zSharp包装(在CodePlex上find) – 这个包装7z exe / LZMA SDK 。 我从我的应用程序引用了项目,并成功创build了一些存档文件,但我无法使用常规的7-Zip程序(
File.7z is not supported archive
)提取文件。 - 7Zip SDK又名LZMA SDK – 我想我不够聪明,不知道如何使用这个(这就是为什么我这里发布)…任何工作代码示例,演示创build一个7zip压缩文件,能够提取定期7zip程序?
- CodeProject C#(.NET)7-Zip归档DLL的接口 – 仅支持从7zip归档中提取…我需要创build它们!
- SharpZipLib – 根据他们的FAQ ,SharpZipLib不支持7zip。
如果你可以保证在所有目标机器上安装7-zip应用程序(和path),你可以通过调用命令行应用程序7z卸载。 不是最优雅的解决scheme,但它是最less的工作。
EggCafe 7Zip cookie示例这是一个使用7Zip DLL的示例(压缩cookie)。
CodePlex Warper这是一个7z的压缩函数的开源项目。
7Zip SDK 7zip(C,C ++,C#,Java)的官方SDK <—我的build议
SharpDevelop.net .Net压缩库
用7zip的CodeProject例子
SharpZipLib许多压缩
SevenZipSharp是另一个解决scheme。 创build7-zip档案…
下面是在C#中使用SevenZip SDK的完整工作示例。
它将编写和读取由Windows 7zip应用程序创build的标准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"); } } }
我用了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文件夹= @“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并将parameter passing给方法。
谢谢请回答
这些最简单的方法是使用.zip文件而不是.7z并使用Dot Net Zip
将7zip命令转换为shell时,还有其他问题,如用户权限,我有问题与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
我使用这个代码
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();
SharpCompress在我看来是最聪明的压缩库之一。 它支持LZMA(7-zip),易于使用和积极开发。
由于它已经支持LZMAstream媒体,所以在编写时不幸的是它只支持7-zip压缩文件阅读。 但档案写在他们的待办事项列表(见自述)。 对于未来的读者:请查看以获取当前状态: https : //github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md