2009-08-31 18 views
7

sto cercando di aggiungere un file a un archivio esistente utilizzando il seguente codice. Quando vengono eseguiti, non vengono visualizzati errori o eccezioni, ma nessun file viene aggiunto all'archivio. Qualche idea, perché?C# sharpziplib aggiunta di file all'archivio esistente

 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

Ho aggiornato la mia risposta. –

risposta

15

In DotNetZip, l'aggiunta di file a un esistente zip è davvero semplice e affidabile.

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

Se si desidera specificare un percorso di directory per questo nuovo file, quindi utilizzare un sovraccarico di diverso per AddFile().

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

Se si desidera aggiungere un set di file, utilizzare AddFiles().

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

Non dovete preoccuparvi di Close(), CloseEntry(), CommitUpdate(), Fine() o qualsiasi altro che gunk.

+0

sto cominciando a odiare SharpZipLib, è troppo bassa livello e la lettura della documentazione è confusa –

1

Penso che la tua chiamata Finish dovrebbe essere prima tuo Close chiamata.

Aggiornamento: Sembra un known bug. È possibile che sia già stato corretto: dovrai verificare la tua versione di SharpZipLib per vedere se incorpora qualche correzione. In caso contrario, è possibile aggirare il problema copiando tutti i file in un nuovo archivio, aggiungendo il nuovo file, quindi spostando il nuovo archivio nel vecchio nome di archivio.

+0

ciao, questo non fa alcuna differenza .. evviva. – Grant

2

Da Codeproject qualcuno ha usato questo codice. L'unica differenza è stretta e finire otherway intorno e la parte di scrittura:

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

Questo non è corretto, la dimensione è newFileStream.length altro Read va storto. Hai un array e si rendono ad esempio 10-1 è lungo 9 byte, da 0 a 8.

Ma la vostra lettura 0-9 ...

+0

Ciao PoweRoy, ho usato questo codice esattamente e ancora nessun errore, ma anche nessun file :( – Grant

+0

Ho anche provato questa ZipFile zipfile = new ZipFile (archivePath); zipFile.BeginUpdate(); ingresso ZipEntry = new ZipEntry (fileName); zipFile.Add (filename); zipFile.CommitUpdate();.. ma poi i percorsi sono tutti sbagliati ho bisogno di impostare i percorsi relativi – 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

ho trovato mantenendolo al ZipFile e ZipEntry una soluzione semplice solo

 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

Biblioteca errata Fahar. – jpierson

0

c'è una cartella ZippedFolder nella directory principale del sito, al suo interno abbiamo un archivio MyZipFiles.

C'è una cartella con nome siteImages che consiste di tutti i file di immagine. Quello che segue è il codice per comprimere le immagini

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

se abbiamo diversi formati di file e vogliamo i vostri file da conservare nella rispettive cartelle, è possibile specificare il codice come segue.

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

ora l'archivio contiene due cartelle immagini ----> img1.jpg, img2, .jpg e un'altra cartella file -> customer.pdf, Sample.doc

0

La classe ZipOutputStream non aggiorna i file ZIP esistenti. Utilizzare invece la classe ZipFile.

Problemi correlati