我的问题与此类似,但它与ASP.NET有关,我的要求略有不同:Android append files to a zip file without having to re-write the entire zip file?
我需要将数据插入用户下载的zip文件中(最多不是1KB的数据,实际上是Adword off-line conversion的数据)。 zip文件通过ASP.NET网站下载。因为zip文件已经足够大(MB的10倍)以避免服务器过载,所以我需要插入这些数据而不重新压缩所有内容。我可以想到两种方法。
方式A :找一个可以在ZIP文件中嵌入特定文件的zip技术,这个特定文件是未压缩的。假设没有校验和,那么在zip文件本身中,用我的特定数据覆盖这个未压缩文件的位就很容易了。如果可能,所有解压缩工具(Windows集成zip,winrar,7zip等)都必须支持这一点。
方式B :在原始ZIP文件中附加一个额外的文件,而不必重新压缩它!这个额外的文件必须存储在ZIP文件的嵌入文件夹中。
我在SevenZipSharp看了一下,其枚举SevenZip.CompressionMode
的值为Create
和Append
,这让我认为方式B 可以实施。根据常见问题解答,DotNetZip似乎也能与Stream很好地协作。
但如果方式A 可能,我会更喜欢它,因为服务器端不需要额外的zip库!
答案 0 :(得分:0)
好的,感谢DotNetZip我能够以非常有效的方式做我想做的事情:
using System.IO;
using Ionic.Zip;
class Program {
static void Main(string[] args) {
byte[] buffer;
using (var memoryStream = new MemoryStream()) {
using (var zip = new ZipFile(@"C:\temp\MylargeZipFile.zip")) {
// The file on which to override content in MylargeZipFile.zip
// has the path "Path\FileToUpdate.txt"
zip.UpdateEntry(@"Path\FileToUpdate.txt", @"Hello My New Content");
zip.Save(memoryStream);
}
buffer = memoryStream.ToArray();
}
// Here the buffer will be sent to httpResponse
// httpResponse.Clear();
// httpResponse.AddHeader("Content-Disposition", "attachment; filename=MylargeZipFile.zip");
// httpResponse.ContentType = "application/octe-t-stream";
// httpResponse.BinaryWrite(buffer);
// httpResponse.BufferOutput = true;
// Just to check it worked!
File.WriteAllBytes(@"C:\temp\Result.zip", buffer);
}
}