ASP.NET:在ZIP文件中插入数据而不必重写整个ZIP文件?

时间:2014-08-29 14:42:07

标签: asp.net file zip compression

我的问题与此类似,但它与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的值为CreateAppend,这让我认为方式B 可以实施。根据常见问题解答,DotNetZip似乎也能与Stream很好地协作。

但如果方式A 可能,我会更喜欢它,因为服务器端不需要额外的zip库!

1 个答案:

答案 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);
   }
}