2014-09-22 78 views
1

我遇到了一個奇怪的問題,使用ZipFile和ZipArchive的.Net 4.5。閱讀帶有空子目錄的壓縮文件夾導致問題

ZipFile.CreateFromDirectory獲取目錄的所有內容,包括空的文件夾。 如果我嘗試使用Windows資源管理器通過右鍵單擊>發送到>壓縮文件夾創建相同的壓縮文件,我收到一條警告消息,指出空文件夾被省略。

我正在將生成的zip文件加載到在Apache Tomcat上運行的應用程序中。此應用程序會爲ZipFile.CreateFromDirectory生成的zip文件中包含的每個文件引發錯誤。我通過Windows資源管理器手動創建的zip文件被讀取得很好。

我懷疑問題在於空的壓縮文件夾,但還沒有能夠明確地得出結論。如果空文件夾是原因,我需要一種方法來使用ZipFile.CreateFromDirectory排除空文件夾。

+1

我沒有.NET 4.5,但是從[備註部分](http://msdn.microsoft.com/en-us/library/hh485721(V = vs.110)的.aspx):_ 「文件系統中的目錄結構保存在歸檔中,如果該目錄爲空,則會創建一個空歸檔。」_所以這是設計。您必須在tomcat上的應用程序中修復它,或者如果可能的話,您必須創建一個臨時文件夾,其中只包含非空文件夾。我還沒有找到一種方法來排除'CreateFromDirectory'中的空文件夾。 – 2014-09-22 14:00:12

+0

謝謝蒂姆。通過溫度壓縮似乎是一個可行的解決方案。如果你把這個作爲答案,我可以接受它。 – 2014-09-22 14:21:08

回答

0

從上面我的評論摘自:

我沒有.NET 4.5,但是從remarks section:從文件系統「的目錄結構,歸檔保留如果該目錄是空的,空的存檔被建造。」所以這是設計。

所以,你要麼必須

  • 修復它在Tomcat中comsuming應用程序,或者你必須
  • 創建其中只包含非空文件夾中的臨時文件夾,如果可能的話

我還沒有找到一種方法排除CreateFromDirectory中的空文件夾。

0

或者,我可以從創建的zip文件中刪除空目錄。儘管這仍然會導致Tomcat應用程序中的錯誤。

 // compress and copy new zip 
     ZipFile.CreateFromDirectory(dirtocopy.FullName, NewZipFilePath); 
     using (ZipArchive za = ZipFile.Open(NewZipFilePath, ZipArchiveMode.Update)) 
     { 
      // only empty folders end with \ 
      List<ZipArchiveEntry> emptyFolders = (from ZipArchiveEntry zae in za.Entries 
           where zae.FullName.EndsWith("\\") 
           select zae).ToList<ZipArchiveEntry>(); 

      emptyFolders.ForEach((ZipArchiveEntry folder) => folder.Delete()); 
     } 
+0

如果你想在你的代碼中修改'emptyFolders.ForEach(f => f.Delete());''emptyFolders.ForEach(f => {f.Delete (); za.CreateEntry(f.FullName.Substring(0,f.FullName.Length - 1)+「/」);});' – Marco 2016-05-06 19:04:15