我下载了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" });
有了这个,我的文件被压缩了whitout问题。我可以解压缩它。
现在......我想压缩同一个文件,但是,我想直接压缩文件,而不是:
这是我的尝试:
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编码,但我的压缩文件不是Text,而是二进制文件。
任何人都可以解释我如何解决它?我需要将我的文件读取到一个字符串并压缩它。 (我不想直接将文件读取到byte [])。
非常感谢,
致以最诚挚的问候,
Nixeus
答案 0 :(得分:1)
您不能将二进制数据放入字符串中,并非每个字节值都具有Unicode代码点。使用ASCII编码同样会导致无法恢复的数据丢失,它只有字符值0到127的字符值,更高的值会产生一个?
你当然可以将byte []转换为字符串,它需要编码。用于此的标准编码在.NET中可从Convert.ToBase64String()方法获得。使用Convert.FromBase64String()再次恢复byte []。它不可避免地会变得那么紧凑,它将比字节[]中的原始数据大4/3。
你永远不能以这种方式生成有效的.7z存档,它当然使用最紧凑的存储空间,即字节数。您必须将FileStream传递给CompressStream()方法。