2013-08-17 63 views
0

我不知道爲什麼這不起作用 - 開始讓我瘋狂!添加多個檔案

沒有其他人似乎也有這個問題

我的代碼看起來是這樣的:

 Stream stream = new MemoryStream(); 
     try 
     { 
      // output zip 
      using (ZipFile zipFile = new ZipFile()) 
      { 
       zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; 
       ForEach(DataFile file In DataFiles) 
       { 
        String sourcePath = dataFile.Path; 
        String archiveName = dataFile.RealName; 
        //byte[] fileContents = File.ReadAllBytes(sourcePath); 
        //zipFile.AddEntry(archiveName, fileContents); 
        zipFile.AddFile(sourcePath, archiveName); 
        //e.FileName = archiveName; 
       } 

       zipFile.AddEntry("README.TXT", readmeMessage); 
       zipFile.Save(stream); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 

所有文件路徑是否有效。

如果我註釋掉其餘部分,添加自述文件可以正常工作。 但添加其他文件會導致壓縮文件無效。

我將不勝感激任何建議!

感謝

UPDATE

我發現,如果我有完全正確的大小初始化流它的工作原理。 有誰知道如何在不寫入磁盤的情況下獲取存檔的大小?

進一步更新

我添加了一個解決方法了。

我能做什麼,我需要通過保存歸檔到磁盤,然後讀它放回另一個流

很蹩腳的,我真的不喜歡它,因此,如果任何人都可以提出一個更好的辦法,我想心懷感激!

回答

0

看來,一旦zip壓縮包河段一定的尺寸(我沒有足夠的測試來確定實際的限制),它不能可靠地保存到流中。

儘管似乎沒有人會這麼說,但唯一的解決方法是將存檔保存到磁盤。

1

我從來沒有與它的工作,但尋找到了DotNetZip Library的例子(一些檢查,提出意見和沒有相關的行刪除),我發現這一點:

public static void Main(String[] args) 
{ 
    ... some input checking ... 

    string ZipFileToCreate = args[0]; 
    string DirectoryToZip = args[1]; 
    try 
    { 
     using (ZipFile zip = new ZipFile()) 
     { 
      // note: this does not recurse directories! 
      String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); 
      foreach (String filename in filenames) 
      { 
       Console.WriteLine("Adding {0}...", filename); 
       ZipEntry e = zip.AddFile(filename); 
       e.Comment = "Added by Cheeso's CreateZip utility."; 
      } 

      zip.Save(ZipFileToCreate); 
     } 
    } 
    catch (System.Exception ex1) 
    { 
     System.Console.Error.WriteLine("exception: " + ex1); 
    } 
} 
+0

奇怪的是,如果我保存到一個文件,它工作正常!保存到一個流給我的問題。 +1給我這個線索! – CompanyDroneFromSector7G

+0

你讀過圖書館給出的例子嗎?查看ZlibStreamExample並向我們展示代碼和錯誤消息,你已經嘗試過了。 –

+0

是的,我有。代碼在問題中。你有什麼特別的例子?對於保存到流中沒有那麼多。 – CompanyDroneFromSector7G