.NETで7-Zipアーカイブを作成するにはどうすればよいですか?
-
03-07-2019 - |
質問
C#コンソールアプリケーションから7-Zipアーカイブを作成するにはどうすればよいですか?通常の広く利用可能な 7-Zip プログラムを使用してアーカイブを抽出できる必要があります。
これは、この質問に対する回答として提供された例での私の結果です
- <!> quot; Shelling out <!> quot; 7z.exeへ-これは最も単純で最も効果的なアプローチであり、それがうまく機能することを確認できます。 workmad3の言及のように、すべてのターゲットマシンに7z.exeがインストールされていることを保証します。これは保証できます。
- 7Zip inメモリ圧縮-これはクッキーの圧縮を指します<!> quot; in-memory <!> quot;クライアントに送信する前。この方法はいくぶん有望なようです。ラッパーメソッド( LZMA SDK をラップする)は、タイプ
byte[]
を返します。File.7z is not supported archive
配列をファイルに書き込むと、7-Zip(<=>)を使用して抽出できません。 - 7zSharp ラッパー(CodePlexにあります)-7z exe / LZMA SDK 。アプリからプロジェクトを参照し、いくつかのアーカイブファイルを正常に作成しましたが、通常の7-Zipプログラム(<=>)を使用してファイルを抽出できませんでした。
- 7Zip SDK別名LZMA SDK -理解するのに十分ではないこれを使用する方法を説明します(これが私がここに投稿した理由です)...通常の7zipプログラムで抽出できる7zipアーカイブの作成を示す実用的なコード例はありますか?
- 7-ZipアーカイブDLLのCodeProject C#(.NET)インターフェイス- 7zipアーカイブからの抽出のみをサポートしています...作成する必要があります!
- SharpZipLib - FAQ 、SharpZipLibは7zipをサポートしていません。
解決
すべてのターゲットマシンに7-zipアプリが(およびパスに)インストールされることを保証できる場合は、コマンドラインアプリ7zを呼び出してオフロードできます。最もエレガントなソリューションではありませんが、最も手間がかかりません。
他のヒント
EggCafe 7Zip Cookieの例これは、7ZipのDLLを使用した例(Cookieの圧縮)です。
CodePlex Wrapper これは、7zのzip圧縮機能をワープするオープンソースプロジェクトです。
7Zip SDK 7zipの公式SDK(C、C ++、C#、Java) <!> lt; ---私の提案
.Net zipライブラリ SharpDevelop.net
CodeProject と7zipの例
SharpZipLib 多くのzip圧縮
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を使用しました。
eg:
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) { }
}
ソースから7 zipをインストールするだけで、パラメーターをメソッドに渡します。
ありがとう。答えが好きです。
このコードを使用します
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ではなく.zipファイルを使用し、 Dot Net Zip を使用することです。 p>
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 は、世の中にある最も賢い圧縮ライブラリの1つです。 LZMA(7-zip)をサポートし、使いやすく、活発に開発されています。
LZMAストリーミングのサポートが既にあるため、執筆時点では、残念ながら7-zipアーカイブの読み取りのみをサポートしています。しかし、アーカイブの書き込みはtodoリストにあります(readmeを参照)。将来の読者の場合:ここで現在のステータスを確認してください: https://github.com /adamhathcock/sharpcompress/blob/master/FORMATS.md
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);