このリンクによると 。NETで7-Zipアーカイブを作成するにはどうすればよいですか? 、WOPRは、7z SDK( http:/ /www.7-Zip.org/sdk.html )
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();
}
}
}
しかし、それを解凍する方法は?
私が試す:
private static void DecompressFileLZMA(string inFile, string outFile)
{
SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();
using (FileStream input = new FileStream(inFile, FileMode.Open))
{
using (FileStream output = new FileStream(outFile, FileMode.Create))
{
coder.Code(input, output, input.Length, -1, null);
output.Flush();
}
}
}
しかし成功せず。
実例はありますか?
ありがとう
PS:他のコードによると http://www.koders.com/csharp/fid43E85EE5AE7BB255C69D18ECC3288285AD67A4A4.aspx?s=Zip+encoder#L5 、デコーダにはヘッダー、ディクショナリが必要であるようです機能するファイルの先頭。 Kodersによって生成されたこのファイルは7zアーカイブではありません。
public static void Decompress(Stream inStream, Stream outStream)
{
byte[] properties = new byte[5];
inStream.Read(properties, 0, 5);
SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();
decoder.SetDecoderProperties(properties);
long outSize = 0;
for (int i = 0; i < 8; i++)
{
int v = inStream.ReadByte();
outSize |= ((long)(byte)v) << (8 * i);
}
long compressedSize = inStream.Length - inStream.Position;
decoder.Code(inStream, outStream, compressedSize, outSize, null);
}
OutSizeは、Compressメソッドと同じ方法で計算されます。しかし、それ以外の場合の出力サイズの計算方法は?
この質問は少し古いですが、グーグルは満足のいく答えを提供できませんので、これは私がまだそれを探している人のためのものです。 SDKのLMZAAloneフォルダーを調べると、ファイルを圧縮および解凍するコードがあります。例として使用すると、エンコーダーのプロパティを読み書きし、ファイルサイズを出力ファイルに解凍する必要があるようです。
private static void CompressFileLZMA(string inFile, string outFile)
{
SevenZip.Compression.LZMA.Encoder coder = new SevenZip.Compression.LZMA.Encoder();
FileStream input = new FileStream(inFile, FileMode.Open);
FileStream output = new FileStream(outFile, FileMode.Create);
// Write the encoder properties
coder.WriteCoderProperties(output);
// Write the decompressed file size.
output.Write(BitConverter.GetBytes(input.Length), 0, 8);
// Encode the file.
coder.Code(input, output, input.Length, -1, null);
output.Flush();
output.Close();
}
private static void DecompressFileLZMA(string inFile, string outFile)
{
SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();
FileStream input = new FileStream(inFile, FileMode.Open);
FileStream output = new FileStream(outFile, FileMode.Create);
// Read the decoder properties
byte[] properties = new byte[5];
input.Read(properties, 0, 5);
// Read in the decompress file size.
byte [] fileLengthBytes = new byte[8];
input.Read(fileLengthBytes, 0, 8);
long fileLength = BitConverter.ToInt64(fileLengthBytes, 0);
coder.SetDecoderProperties(properties);
coder.Code(input, output, input.Length, fileLength, null);
output.Flush();
output.Close();
}
この方法で作成されたファイルは7Zipプログラムでも抽出できますが、ファイル名やその他のメタデータは保持されません。
私はmanaged-lzmaを強くお勧めします。
https://github.com/weltkante/managed-lzma
ファイルエンコーディングでファイル情報とディレクトリ構造を保持します。