2014-07-24 16 views
1
System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath); 

在C#中使用ZipFile中,我試圖從已知位置提取文件,並拋出以下錯誤: System.IO.Exception:郵編條目名稱以目錄分隔符結尾,但包含數據ZIP條目名稱在目錄分隔符結束,但包含數據

我已經完成了一些研究,ExtractToDirectory在MSDN中進行了解釋,但無法找到此錯誤定義。你能解釋爲什麼這個錯誤發生了嗎?

從MSDN:

IOException異常

The directory specified by destinationDirectoryName already exists.

- 或 -

在歸檔中的條目的名稱爲空,僅包含空白,或至少包含一個無效字符。

- 或 -

Extracting an archive entry would create a file that is outside the directory specified by destinationDirectoryName. (For example, this might happen if the entry name contains parent directory accessors.)

- 或 -

An archive entry to extract has the same name as an entry that has already been extracted from the same archive.

+0

我想這主要是指存儲於zip壓縮文件或者包含'..'或在'\'結束的文件名。你確定你不會弄亂路徑,例如使用目標路徑作爲zip存檔內部路徑? – Mario

+0

花了幾個小時後發現的一件事是,這個問題與zip文件的生成方式有關。 爲了解決問題,我使用7-zip生成zip文件。使用winRar生成zip文件解決了這個問題。 我仍然不知道它的根本原因。 – erenalgan

+0

@Mario,這也是我最初的猜測。不過,我還沒有發現有關路徑的任何問題(感謝評論)。 – erenalgan

回答

3

我的研究表明,當你使用「超」壓縮級別壓縮7-Zip實用程序中的文件,某些檔案無法解壓縮使用.NET System.IO.Compression.ZipFile.ExtractToDirectory()方法。 錯誤消息是:Zip條目名稱以目錄分隔符結尾,但包含數據。 500MB +(小檔案似乎解壓精) -

  1. 目標歸檔很大:只有滿足以下三個條件

    根據我的觀察,出現此錯誤。

  2. 存檔的根目錄只包含文件夾(如果您至少將一個文件添加到存檔的根目錄,則它也會解壓縮)。
  3. 使用7-Zip Ultra壓縮。

最後,我發現了三個解決方案,這7-Zip的錯誤。

解決方案1 ​​:將至少一個文件添加到存檔的根目錄(任何虛擬文件或readme.txt文件)。

解決方案2:使用本地Windows壓縮實用程序(選擇文件,右鍵單擊,發送到 - >壓縮文件夾)。

解決方案3:不要使用7-Zip超級壓縮。

所有這些解決方案都爲我解決了這個問題。選擇最適合您項目的產品。

+0

我發現另一種可能的情況 - 如果您使用7zip壓縮安裝的驅動器上的某些內容(但在OSX上爲本機)。我有一臺虛擬機,我在Windows上工作,但驅動器正在兩個操作系統之間共享。解決方案2解決了這個問題。 – JasCav

+0

我有一個用7z創建的.zip文件,使用選項'-tzip',相當於'-tzip -mm = Deflate -mx = 5',即它不使用7-zip ultracompression。另外,我在檔案底部放置了一個文件。文件_is_ large,600MB +,包含36個36個文件中的45000個文件。我在調試器中使用'System.IO.Compression.ZipFile.Open'打開了zip文件。在所有36個dirs條目中,全部以「/」結尾,但只有兩個顯示非零長度,並且這個長度完全沒有意義。結果是System.IO.Compression.ZipFile無法解壓文件 - 即soln 1和3不起作用。 –

1

ZipArchive條目以目錄分隔符「/」結尾,但具有長度時發生錯誤!= 0

你可以很容易找到這些條目與

zip.Entries.Where(o => o.FullName.EndsWith("/") && o.Length != 0) 
+0

謝謝你。我的問題是這個非零長度來自哪裏? zip檔案中的所有目錄都以「/」結尾,但所有的目錄都應該有長度爲0.偶爾有些長度不爲零,在這種情況下,長度看起來完全沒有意義。如果故障存在於7z.exe產生的存檔中,或者該錯誤存在於「System.IO.Compression.ZipFile.Open」中,您是否有任何想法? –

+0

@ DavidI.McIntosh我無法想象ZipFile.Open是如何修改zip內容的。它更有可能是由外部zip程序導致的。通過在ZipFile.Open之前製作zip文件的副本並將原始文件與打開文件進行比較以確保其未被修改,應該很容易驗證。 – MerickOWA

+0

對不起,我不清楚。 「這個錯誤在於'System.IO.Compression.ZipFile.Open'」,我沒有質疑它是否修改.zip文件。在讀取zip文件時,我們看到'System.IO.Compression.ZipFile.Open'構建的數據結構中的「非零」長度,但我不清楚它是否實際上是壞數據文件,或者如果'System.IO.Compression.ZipFile.Open'有一個錯誤導致它在內部使用不正確的長度條目構建數據結構。 –

相關問題