使用SevenZipSharp压缩内存中的文件,奇怪的错误

本文关键字:错误 文件 使用 压缩 内存 SevenZipSharp | 更新日期: 2023-09-27 18:32:30

我下载SevenZipSharp Lib是为了压缩一些文件。

我用它来压缩文件:

var libPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "7-zip", "7z.dll");
SevenZip.SevenZipCompressor.SetLibraryPath(libPath);
SevenZip.SevenZipCompressor compressor = new SevenZipCompressor();
compressor.CompressFiles(@"C:'myTestFile.mdf", new string[] { @"C:'myTestFileCompressed.7z" });

有了这个,我的文件被压缩了。我可以解压缩它。

现在。。。我想压缩同一个文件,但是,我想

  • 读取字符串中的文件。是的,在字符串中,而不是在字节[]中。
    • 将我的字符串转换为字节[]将字节 [] 压缩为另一个字节 []。

这是我的尝试:

string strToCompress = File.ReadAllText(@"C:'myTestFile.mdf");
SevenZipCompressor compressor = new SevenZipCompressor();
byte[] byteArrayToCompress = Encoding.ASCII.GetBytes(text);
MemoryStream stream = new MemoryStream(byteArrayToCompress);
MemoryStream streamOut = new MemoryStream();
compressor.CompressStream(stream, streamOut);
string strcompressed = Encoding.ASCII.GetString(streamOut.ToArray());
File.WriteAllText(@"C:'myfileCompressed.7z",strcompressed);

我的问题很简单:

如果我比较这两种方法产生的大小,它是 3 603 443 字节与 3 604 081 字节。此外,我无法解压缩第二种方法生成的文件。

也许是因为我使用了ASCII编码,但我要压缩的文件不是文本,而是二进制文件。

任何人都可以解释我如何解决它?我需要将我的文件读取为字符串并压缩它。(我不想直接将文件读取到字节[](。

多谢

此致敬意

尼克塞斯

使用SevenZipSharp压缩内存中的文件,奇怪的错误

不能将二进制数据放入字符串中,并非每个字节值都有 Unicode 代码点。 使用 ASCII 编码同样总是会导致无法挽回的数据丢失,它只有字节值 0 到 127 的字符,更高的值会产生 ?

你当然可以将一个字节[]转换为一个字符串,它需要编码。 用于此目的的标准编码在 .NET 中可通过 Convert.ToBase64String(( 方法获得。 您可以使用 Convert.FromBase64String(( 再次恢复 byte[]。 不可避免地,它不会那么紧凑,它将比一个字节中的原始数据大 4/3[]。

您永远无法以这种方式生成有效的.7z存档,它当然使用最紧凑的存储,即字节。 您必须将 FileStream 传递给 CompressStream(( 方法。