如何从C#控制台应用程序创建7-Zip存档?我需要能够使用常规的,广泛使用的7-Zip程序来提取档案.
"淘汰"到7z.exe - 这是最简单,最有效的方法,我可以确认它运行良好.正如workmad3所提到的,我只需要保证所有目标机器上都安装了7z.exe,这是我可以保证的.
7Zip内存压缩 - 这是指在发送给客户端之前"在内存中"压缩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存档常规7zip程序?
用于7-Zip存档DLL的CodeProject C#(.NET)接口 - 仅支持从7zip存档中提取...我需要创建它们!
SharpZipLib - 根据他们的FAQ,SharpZipLib不支持7zip.
Patrick Desj.. 76
EggCafe 7Zip cookie示例这是一个带有7Zip DLL的示例(压缩cookie).
CodePlex Wrapper 这是一个7z的warp压缩功能的开源项目.
7Zip SDK 7zip(C,C++,C#,Java)的官方SDK <---我的建议
SharpDevelop.net的 .Net zip库
使用7zip的CodeProject示例
SharpZipLib很多拉链
EggCafe 7Zip cookie示例这是一个带有7Zip DLL的示例(压缩cookie).
CodePlex Wrapper 这是一个7z的warp压缩功能的开源项目.
7Zip SDK 7zip(C,C++,C#,Java)的官方SDK <---我的建议
SharpDevelop.net的 .Net zip库
使用7zip的CodeProject示例
SharpZipLib很多拉链
如果您可以保证将在所有目标计算机上安装(并且在路径中)7-zip应用程序,则可以通过调用命令行app 7z来卸载.不是最优雅的解决方案,但它是最不起作用的.
SevenZipSharp是另一种解决方案.创建7-zip档案......
这是使用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"); } } }
我用的是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(); } } }