c#sharpziplib将文件添加到现有存档

我正在尝试使用以下代码将文件添加到现有存档。 运行时不会显示任何错误或exception,但也不会将任何文件添加到存档中。 有什么想法吗?

using (FileStream fileStream = File.Open(archivePath, FileMode.Open, FileAccess.ReadWrite)) using (ZipOutputStream zipToWrite = new ZipOutputStream(fileStream)) { zipToWrite.SetLevel(9); using (FileStream newFileStream = File.OpenRead(sourceFiles[0])) { byte[] byteBuffer = new byte[newFileStream.Length - 1]; newFileStream.Read(byteBuffer, 0, byteBuffer.Length); ZipEntry entry = new ZipEntry(sourceFiles[0]); zipToWrite.PutNextEntry(entry); zipToWrite.Write(byteBuffer, 0, byteBuffer.Length); zipToWrite.CloseEntry(); zipToWrite.Close(); zipToWrite.Finish(); } } 

在DotNetZip中 ,将文件添加到现有zip非常简单可靠。

 using (var zip = ZipFile.Read(nameOfExistingZip)) { zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; zip.AddFile(additionalFileToAdd); zip.Save(); } 

如果要为该新文件指定目录路径,请对AddFile()使用不同的重载。

 using (var zip = ZipFile.Read(nameOfExistingZip)) { zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; zip.AddFile(additionalFileToAdd, "directory\\For\\The\\Added\\File"); zip.Save(); } 

如果要添加一组文件,请使用AddFiles()。

 using (var zip = ZipFile.Read(nameOfExistingZip)) { zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; zip.AddFiles(listOfFilesToAdd, "directory\\For\\The\\Added\\Files"); zip.Save(); } 

您不必担心Close(),CloseEntry(),CommitUpdate(),Finish()或任何其他gunk。

从Codeproject有人使用此代码。 只差异很接近并完成其他方面和写入部分:

 using (ZipOutputStream s = new ZipOutputStream(File.Create(txtSaveTo.Text + "\\" + sZipFileName + ".zip"))) { s.SetLevel(9); // 0-9, 9 being the highest compression byte[] buffer = new byte[4096]; foreach (string file in filenames) { ZipEntry entry = new ZipEntry(Path.GetFileName(file)); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); using (FileStream fs = File.OpenRead(file)) { int sourceBytes; do { sourceBytes = fs.Read(buffer, 0, buffer.Length); s.Write(buffer, 0, sourceBytes); } while (sourceBytes > 0); } } s.Finish(); s.Close(); } 

BTW:

 byte[] byteBuffer = new byte[newFileStream.Length - 1]; newFileStream.Read(byteBuffer, 0, byteBuffer.Length); 

这是不正确的,大小是newFileStream.length否则Read出错。 你有一个数组,例如10-1是9字节长,从0到8。

但你从0到9读…

我认为你的Finish电话应该你的Close通话之前

更新:这看起来像一个已知的错误 。 它可能已经修复 – 你需要检查你的SharpZipLib版本,看它是否包含任何修复。 如果没有,您可以通过将所有文件复制到新存档,添加新文件,然后将新存档移动到旧存档名称来解决此问题。

  ///  /// 添加压缩文件 p 为客户端传回来的文件/夹列表,用分号隔开,不包括主路径, zipfile压缩包的名称///  ///  ///  public void AddZipFile(string p, string zipfile) { if (ServerDir.LastIndexOf(@"\") != ServerDir.Length - 1) { ServerDir += @"\"; } string[] tmp = p.Split(new char[] { ';' }); //分离文件列表if (zipfile != "") //压缩包名称不为空{ string zipfilepath=ServerDir + zipfile; if (_ZipOutputStream == null) { _ZipOutputStream = new ZipOutputStream(File.Create(zipfilepath)); } for (int i = 0; i < tmp.Length; i++) { if (tmp[i] != "") //分离出来的文件名不为空{ this.AddZipEntry(tmp[i], _ZipOutputStream, out _ZipOutputStream); //向压缩文件流加入内容} } } } private static ZipOutputStream _ZipOutputStream; public void Close() { _ZipOutputStream.Finish(); _ZipOutputStream.Close(); } 

站点的根目录下有一个ZippedFolder文件夹,里面有我们的存档MyZipFiles

有一个名为siteImages的文件夹,其中包含所有图像文件。 以下是压缩图像的代码

 string zipPath = Server.MapPath("~/ZippedFolder/MyZipFiles.zip"); using (ZipFile zip = new ZipFile()) { zip.AddFile(Server.MapPath("~/siteImages/img1.jpg"),string.Empty); zip.AddFile(Server.MapPath("~/siteImages/img2.jpg"),string.Empty); zip.AddFile(Server.MapPath("~/siteImages/img2.jpg"),string.Empty); zip.Save(zipPath); } 

如果我们有不同的文件格式,并且我们希望您的文件保存在相应的文件夹中,则可以按如下方式指定代码。

 string zipPath = Server.MapPath("~/ZippedFolder/MyZipFiles.zip"); using (ZipFile zip = new ZipFile()) { zip.AddFile(Server.MapPath("~/siteimages/img1.jpg"), "images"); zip.AddFile(Server.MapPath("~/siteimages/img2.jpg"), "images"); zip.AddFile(Server.MapPath("~/documents/customer.pdf"), "files"); zip.AddFile(Server.MapPath("~/documents/sample.doc"), "files"); zip.Save(zipPath); } 

现在存档包含两个文件夹图像 —-> img1.jpg,img2,.jpg和另一个文件夹文件 – > customer.pdf,sample.doc

ZipOutputStream类不更新现有的ZIP文件。 请改用ZipFile类。

我找到了一个简单的解决方案,只保留ZipFile和ZipEntry

  ZipFile zipExisting = ZipFile.Read(Server.MapPath("/_Layouts/includes/Template.zip")); ICollection entries = _zipFileNew.Entries; foreach (ZipEntry zipfile in entries) { zipExisting.AddEntry(zipfile.FileName, zipfile.InputStream); } zipExisting.Save(Response.OutputStream); Response.End();