【发布时间】:2015-03-17 09:08:49
【问题描述】:
我正在使用 .NET 4.5 的 ZipArchive,它与 FileStream 一起正常工作:
public static byte[] CompressWithFiles(string dir)
{
var archiveName = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".zip");
var files = Directory.GetFiles(testsConsoleDir);
using (var stream = new FileStream(archiveName, FileMode.Create))
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
{
foreach (var file in files)
archive.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal);
}
}
byte[] result = File.ReadAllBytes(archiveName);
return result;
}
但是,如果我尝试使用 MemoryStream 压缩文件,它会返回无法打开的字节数组并保存到磁盘:
public static byte[] CompressInMemory(string dir)
{
var files = Directory.GetFiles(dir);
byte[] result = null;
using (var stream = new MemoryStream())
{
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
{
foreach (var file in files)
archive.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal);
stream.Position = 0;
result = new byte[stream.Length];
stream.Read(result, 0, (int)stream.Length);
}
}
return result;
}
我比较了第一种方法和第二种方法的数组,发现它们是相等的,除了第一个数组末尾有一个剩余字节,这使得 zip 存档可以打开。如何在CompressInMemory 方法中解决此问题?我试图避免将数据存储在磁盘上。
【问题讨论】:
标签: .net compression zip