2009-08-31 5 views
7

пытаюсь добавить файл в существующий архив, используя следующий код. При запуске не отображаются ошибки или исключения, но файлы не добавляются в архив. Любые идеи почему?C# sharpziplib добавление файла в существующий архив

 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

Я обновил свой ответ. –

ответ

15

В 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() или любой из этой другой ерунды.

+0

Я начинаю ненавидеть SharpZipLib, это слишком низко уровень и чтение документации путают. –

1

Я думаю, что ваш Finish вызова должен быть перед тем вашего Close вызова.

Обновление: Это выглядит как known bug. Возможно, он уже был исправлен - вам нужно проверить версию SharpZipLib, чтобы узнать, содержит ли оно какое-либо исправление. Если нет, вы можете обойти это, скопировав все файлы в новый архив, добавив новый файл, а затем переместив новый архив на имя старого архива.

+0

привет, это не имеет никакого значения .. ура. – Grant

2

От Codeproject кто-то использовал этот код. Только разница близка и закончить otherway вокруг и часть записи:

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

КСТАТИ:

byte[] byteBuffer = new byte[newFileStream.Length - 1]; 

       newFileStream.Read(byteBuffer, 0, byteBuffer.Length); 

Это неправильно, размер newFileStream.length еще чтение идет не так. вас есть массив, и вы делаете это, например, 10-1 длиной 9 байт, от 0 до 8.

Но прочитанного от 0 до 9 ...

+0

Привет PoweRoy, я не использовал этот код в точности так и до сих пор никаких ошибок, но и не файл :( – Grant

+0

я также попробовал этот ZipFile ZipFile = новый ZipFile (archivePath); zipFile.BeginUpdate(); ZipEntry вход = новый ZipEntry (Filename); zipFile.Add (Filename); zipFile.CommitUpdate();.. но пути неправильны мне нужно установить относительные пути – 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

Я нашел простое решение, сохраняя его ZipFile и ZipEntry только

 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

Неверная библиотека Fahar. – jpierson

0

есть папка 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

0

Класс ZipOutputStream не обновляет существующие ZIP-файлы. Вместо этого используйте класс ZipFile.

 Смежные вопросы

  • Нет связанных вопросов^_^