题
我怎么可以创造7-Zip从我的C#控制台应用程序?我需要可以提取存档的使用规则,广泛提供 7-Zip 程序。
这里是我的结果与所提供的示例作为对这个问题的答案
- "轰击",7z.exe -这是最简单和最有效的办法,我可以确认 它工作得很好.作为 workmad3提到, 我只需要保证,7z.exe 安装在所有目标的机器,这是什么我可以保证。
- 7Zip在存储器中的压缩 -这是指压缩饼干"存中的"之前发送给客户;这种方法似乎有点有希望的。包装的方法(包裹 伊兹玛SDK)返回的类型
byte[]
.当我写的byte[]
阵列一个文件,我不可以提取它用7-Zip(File.7z is not supported archive
). - 7zSharp 包装(上找到更)-这个包裹7z exe/伊兹玛SDK.我引用的项目从我的应用程序,它成功地创造了一些档案文件,但我不能提取的文件使用的常规7-Zip程序(
File.7z is not supported archive
). - 7Zip SDK又名伊兹玛SDK -我猜我没有足够的智慧想出如何使用这一(这就是为什么我在这里贴)...任何工作的代码实例,展示创建一个7zip档案,是能够取由经常7zip的程序?
- 演示C#(.网)的接口为7-Zip Archive Dll -只支持中提取7zip的档案...我需要建立他们!
- SharpZipLib -根据他们的 常见问题,SharpZipLib不支持7zip.
解决方案
如果你可以保证在7-zip应用程序,将被安装(和在路径)所有目标的机器,你可以卸载,通过调用命令行程序7z.不是最优雅的解决方案,但这是最少的工作。
其他提示
EggCafe7Zip cookie例 这是一个例子(荏苒cookie)与DLL的7Zip.
更Wrapper 这是一个开放源项目,经压缩的功能7z.
7Zip SDK 官方SDK for7zip(C、C++、C#、Java) <---我的建议
.净拉链图书馆通过 SharpDevelop.net
演示 例7zip
SharpZipLib 许多荏苒
SevenZipSharp 另外一个解决方案。创建了7-zip...
这里有一个完整的工作例子使用SevenZip SDK。
它将编写和阅读,标准7zip的文件,因为创建Windows7zip应用程序。
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 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) { }
}
只要安装7zip从源并通过参数的方法。
谢谢。请喜欢的答案。
我使用这个代码
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();
这些最简单的方法是与工作。拉链文件代替。7z和使用 点网的拉链
当剥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
SharpCompress 在我看来是一个聪明的库压缩在那里。它支持伊兹玛(7-zip),是易于使用,并且在积极发展。
因为它有伊兹玛流支持已经在撰写本文时它遗憾的是只有支持7-zip archive阅读。但是,档案的文字是在他们的待办列表(见readme).对于未来的读者:检查获得的目前状况: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md
安装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);