Как создать 7-Zip архивы with.NET?
как я могу создать 7-Zip архивы из моего консольного приложения C#? Мне нужно иметь возможность извлекать архивы, используя обычный, широко доступный 7-Zip
9 ответов:
Если вы можете гарантировать, что приложение 7-zip будет установлено (и в пути) на всех целевых машинах, вы можете разгрузить, вызвав приложение командной строки 7z. не самое элегантное решение, но это наименьшая работа.
EggCafe примеру в 7-Zip печенье это пример (zipping cookie) с DLL 7Zip.
CodePlex Wrapper Это проект с открытым исходным кодом, который деформирует функцию молнии 7z.
7zip SDK официальный SDK для 7zip (C, C++, C#, Java)
.Net zip library by SharpDevelop.net
CodeProject пример с 7zip по
SharpZipLib много проносясь
SevenZipSharp другое решение. Создает 7-zip архивы...
вот полный рабочий пример использования SEVENZIP SDK в C#.
он будет писать и читать стандартные файлы 7zip, созданные приложением Windows 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 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-ZipzG.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 из источника и передайте параметр методу.
спасибо. Пожалуйста, как ответ.
Я использую этот код
string PZipPath = @"C:\Program Files-Zipz.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();
С ними проще всего работать .zip-файлы вместо .7z и использовать Dot Net Zip
при выделении команд 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 на мой взгляд, это одна из самых умных библиотек сжатия. Он поддерживает LZMA (7-zip), прост в использовании и находится в активной разработке.
поскольку он уже поддерживает потоковую поддержку LZMA, на момент написания он, к сожалению, поддерживает только чтение архива 7-zip. Но архивная запись находится в их списке задач (см. readme). Для будущих читателей: проверьте, чтобы получить текущий статус здесь: https://github.com/adamhathcock/sharpcompress/blob/master/FORMATS.md