2009-08-31 13 views
7

Ich versuche, eine Datei zu einem vorhandenen Archiv mit dem folgenden Code hinzuzufügen. Beim Ausführen werden keine Fehler oder Ausnahmen angezeigt, aber dem Archiv werden auch keine Dateien hinzugefügt. Irgendwelche Ideen warum?C# shartziplib Hinzufügen von Datei zu vorhandenem Archiv

 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(); 
      } 
     } 
+0

Ich aktualisierte meine Antwort. –

Antwort

15

In DotNetZip, das Hinzufügen von Dateien zu einem bestehenden Zip ist wirklich einfach und zuverlässig.

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

Wenn Sie einen Verzeichnispfad für diese neue Datei angeben möchten, verwenden Sie eine andere Überladung für AddFile().

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

Wenn Sie eine Reihe von Dateien hinzufügen möchten, verwenden Sie AddFiles().

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

Sie müssen nicht über Close(), CloseEntry(), CommitUpdate(), Finish() oder jede dieser anderen gunk kümmern.

+0

ich fange an SharpZipLib zu hassen, dann ist es zu niedrig level und das Lesen der Dokumentation ist verwirrend –

1

Ich denke, Ihr Finish Anruf vor Ihr Close Anruf sein sollte.

Aktualisierung: Das sieht wie ein known bug aus. Es ist möglich, dass es bereits repariert wurde - Sie müssen Ihre SharpZipLib-Version überprüfen, um zu sehen, ob sie einen Fix enthält. Wenn nicht, können Sie umgehen, indem Sie alle Dateien in ein neues Archiv kopieren, die neue Datei hinzufügen und dann das neue Archiv auf den alten Archivnamen verschieben.

+0

hi, das macht keinen Unterschied .. Prost. – Grant

2

Von Codeproject hat jemand diesen Code benutzt. Der einzige Unterschied liegt in der Nähe und otherway um und der Schreib Teil beenden:

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); 

Diese falsch ist, die Größe ist newFileStream.length sonst das Lesen schief geht. Sie haben ein Array und Sie machen es zum Beispiel 10-01 September Bytes lang ist, von 0 bis 8.

Aber Ihre Lesung von 0 bis 9 ...

+0

Hallo PoweRoy, habe ich diesen Code genau verwendet und noch keine Fehler, sondern auch keine Datei :( – Grant

+0

i auch diese ZipFile ZipFile = new ZipFile (archivePath) versucht haben, zipFile.BeginUpdate(); ZipEntry Eintrag = new ZipEntry (filename); zipFile.Add (filename); zipFile.CommitUpdate();.. aber dann die Pfade falsch sind ich relative Pfade festlegen müssen – Grant

1
/// <summary> 
    /// 添加压缩文件 p 为客户端传回来的文件/夹列表,用分号隔开,不包括主路径, zipfile压缩包的名称 
    /// </summary> 
    /// <param name="p"></param> 
    /// <param name="zipfile"></param> 
    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(); 
    } 
-1

Ich habe eine einfache Lösung, die es zu ZipFile und ZipEntry gefunden halten nur

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

     zipExisting.Save(Response.OutputStream); 
     Response.End(); 
+0

Falsche Bibliothek Fahar. – jpierson

0

gibt es einen Ordner ZippedFolder in Stammverzeichnis der Website, im Inneren haben wir ein Archiv MyZipFiles.

Es gibt einen Ordner mit dem Namen siteImages, der aus allen Bilddateien besteht. Im folgenden wird der Code die Bilder

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

zip, wenn wir verschiedene Dateiformate haben, und wir möchten, dass Ihre Dateien in entsprechenden Ordnern gespeichert werden, können Sie den Code wie folgt angeben.

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

nun das Archiv enthält zwei Ordner Bilder ----> img1.jpg, img2, .jpg und einen anderen Ordner Dateien -> customer.pdf, Sample.doc

0

Die Klasse ZipOutputStream aktualisiert keine vorhandenen ZIP-Dateien. Verwenden Sie stattdessen die Klasse ZipFile.