如何从C#控制台应用程序创建7-Zip档案?我需要能够使用常规的,广泛可用的7-Zip程序来提取档案。
byte[]
。当我将byte[]
数组写入文件时,我无法使用7-Zip(File.7z is not supported archive
)提取它。File.7z is not supported archive
)提取文件。答案 0 :(得分:76)
EggCafe 7Zip cookie example这是一个带有7Zip DLL的示例(压缩cookie)。
CodePlex Wrapper 这是一个开源项目,它具有7z的压缩功能。
7Zip SDK 7zip的官方SDK(C,C ++,C#,Java)< ---我的建议
.Net zip库SharpDevelop.net
CodeProject 7zip的例子
SharpZipLib许多拉链
答案 1 :(得分:29)
如果您可以保证将在所有目标计算机上安装(并且在路径中)7-zip应用程序,则可以通过调用命令行app 7z来卸载。不是最优雅的解决方案,但它是最不起作用的。
答案 2 :(得分:25)
SevenZipSharp是另一种解决方案。创建7-zip档案......
答案 3 :(得分:23)
这是使用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");
}
}
}
答案 4 :(得分: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();
}
}
}
答案 5 :(得分: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,然后将参数传递给方法。
感谢。请回答。
答案 6 :(得分: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();
答案 7 :(得分:1)
这些最简单的方法是使用.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
答案 8 :(得分:0)
SharpCompress是最聪明的压缩库之一。它支持LZMA(7-zip),易于使用且正在积极开发中。
由于它已经具有LZMA流媒体支持,在撰写本文时它不幸仅支持7-zip存档阅读。但是档案写作在他们的待办事项清单上(见自述)。对于未来的读者:检查以获取当前状态:https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md
答案 9 :(得分:0)
安装名为SevenZipSharp.Interop
的NuGet软件包
然后:
SevenZipBase.SetLibraryPath(@".\x86\7z.dll");
var compressor = new SevenZip.SevenZipCompressor();
var filesToCompress = Directory.GetFiles(@"D:\data\");
compressor.CompressFiles(@"C:\archive\abc.7z", filesToCompress);
答案 10 :(得分:0)
使用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 ++引擎的解决方案,即可以从c#调用7zip可执行文件,也可以使用squid-box/SevenZipSharp,它是7zip c / c ++ dll文件的包装,并且似乎是SevenZipSharp的最新分支。 还没有测试过包装器,但我希望它的表现与原生7zip一样。但是希望它将提供压缩流的可能性,如果您直接调用该exe,则显然无法压缩。否则,我想调用exe并没有优势。包装器中有一些additional dependencies,因此不会使您发布的项目变得“干净”。
通过某种方式,.Net Core团队考虑在.Core ver。的system.io类中实现LZMA。 5,那太好了!
(我知道这只是一种注释,而不是答案,但是能够提供代码段不能是注释)
答案 11 :(得分:0)
Here 是创建和提取 7zip 的代码(基于 LZMA SDK - C#)
注意:使用相同代码创建的 7z 存档可以取消存档。由于代码使用使用早期版本的 LZMA SDK 的托管 LZMA