oli*_*dev 4 .net c# compression 7zip
我从这里下载了SDK 7zip .
然后我使用此代码将文件压缩为7zip:
private static void CompressFileLZMA(string inFile, string outFile)
{
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我在网站上尝试了SDK版本9.20和9.22 beta.
压缩似乎正在压缩我的文件:1.6 MB到239 KB.
但是,如果我使用WinRar或7zip进行解压缩.他们无法识别存档文件,错误就像
"未知存档文件或损坏的文件"
对此有何看法?
你看过SDK附带的示例项目了吗?它位于CS\7zip\Compress\LzmaAlone\文件夹中,它包含一个文件LmzaAlone.cs,其中包含一些编码文件的内容.它在写出压缩数据之前做了类似的事情:
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
};
Compression.LZMA.Encoder encoder = new Compression.LZMA.Encoder();
encoder.SetCoderProperties(propIDs, properties);
encoder.WriteCoderProperties(outStream);
if (trainStream != null)
{
CDoubleStream doubleStream = new CDoubleStream();
doubleStream.s1 = trainStream;
doubleStream.s2 = inStream;
doubleStream.fileIndex = 0;
inStream = doubleStream;
long trainFileSize = trainStream.Length;
doubleStream.skipSize = 0;
if (trainFileSize > dictionary)
doubleStream.skipSize = trainFileSize - dictionary;
trainStream.Seek(doubleStream.skipSize, SeekOrigin.Begin);
encoder.SetTrainSize((uint)(trainFileSize - doubleStream.skipSize));
}
// only now does it write out the compressed data:
encoder.Code(inStream, outStream, -1, -1, null);
Run Code Online (Sandbox Code Playgroud)
所以看起来你需要先写出几个文件头来提供有关压缩数据的详细信息.
如果你下载7Zip的源代码,你会发现在doc文件夹中有一个文件7zFormat.txt,其中包含7个zip文件格式的描述.这可能有助于您创建有效的存档.
| 归档时间: |
|
| 查看次数: |
2528 次 |
| 最近记录: |