2012-08-08 29 views
5

在C#中,我正在使用DotNetZip 我有一個zip 「innerZip.zip」,其中包含一些數據, 和另一個包含innerZip的稱爲「outerZip.zip」的zip。 爲什麼我這樣做? 好吧,設置密碼時,密碼實際上適用於添加到存檔而不是整個存檔的單個條目,通過使用此內部/外部組合,我可以設置傳遞給整個內部zip,因爲它是一個條目的外部。在嘗試從內部Zip文件(另一個Zip中的Zip)獲取流時出現「無法將其讀取爲Zip文件」異常

問題是,好,代碼勝於正常的話更好:

ZipFile outerZip = ZipFile.Read("outerZip.zip"); 
outerZip.Password = "VeXe"; 
Stream innerStream = outerZip["innerZip.zip"].OpenReader(); 
ZipFile innerZip = ZipFile.Read(innerStream); // I'm getting the exception here. 
innerZip["Songs\\IronMaiden"].Extract(tempLocation); 

爲什麼我得到那個異常? 內部文件是一個zip文件,所以我不應該得到那個例外嗎? 有沒有辦法解決這個問題,或者我只是從外部提取內部的一個,然後訪問它?

感謝名單提前..

回答

6

會出現此異常,因爲CrcCalculatorStream流是OpenReader創建是不可搜索,並ZipFile.Read(Stream)試圖尋求在打開zip文件。

zip壓縮的性質阻止了在壓縮內容中尋找位置,內容必須按順序解壓縮。

解決此問題的一種方法是將內部zip文件解壓縮到MemoryStream,然後通過ZipFile.Read加載。

MemoryStream ms = new MemoryStream(); 
outerZip["innerZip.zip"].Extract(ms); 
ms.Seek(0, SeekOrigin.Begin); 
ZipFile innerZip = ZipFile.Read(ms); 
innerZip["Songs\\IronMaiden"].Extract(tempLocation); 
+1

我知道這篇文章有點過時。但是,謝謝你的提示!它拯救了我的一個同事我的小時工! +1 – 2016-09-15 20:51:41