2014-09-22 77 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