【问题标题】:Reading zipped folder with empty subdirectories causes problems读取带有空子目录的压缩文件夹会导致问题
【发布时间】:2014-11-16 12:27:25
【问题描述】:

我在 .Net 4.5 中使用 ZipFile 和 ZipArchive 时遇到了一个奇怪的问题。

ZipFile.CreateFromDirectory 获取目录的所有内容,包括空文件夹。 如果我尝试使用 Windows 资源管理器通过右键单击 > 发送到 > 压缩文件夹来创建相同的 zip 文件,我会收到一条警告消息,指出空文件夹已被忽略。

我正在将生成的 zip 文件加载到在 Apache Tomcat 上运行的应用程序中。此应用程序会为我使用 ZipFile.CreateFromDirectory 生成的 zip 中包含的每个文件引发错误。我通过 Windows 资源管理器手动创建的 zip 可以正常读取。

我怀疑问题出在空的压缩文件夹上,但尚未能够明确得出结论。如果空文件夹是原因,我需要一种方法来使用 ZipFile.CreateFromDirectory 排除空文件夹。

【问题讨论】:

  • 我没有.NET 4.5,但是来自remarks section: "文件系统中的目录结构保存在存档中。如果目录为空,则创建一个空存档。” 所以这是设计使然。您要么必须在 tomcat 上的 comsuming 应用程序中修复它,要么必须创建一个临时文件夹,如果可能的话只包含非空文件夹。我还没有找到排除CreateFromDirectory中空文件夹的方法。
  • 谢谢蒂姆。通过 temp 压缩似乎是一个可行的解决方案。如果您将此作为答案,我可以接受。

标签: c# .net zip compression


【解决方案1】:

摘自我上面的评论:

我没有.NET 4.5,但来自remarks section“文件系统中的目录结构保存在存档中。如果目录为空,则会创建一个空存档。” 所以这是设计使然。

所以你要么必须

  • 在tomcat的comsuming应用程序中修复它,否则你必须
  • 如果可能,创建一个仅包含非空文件夹的临时文件夹

我还没有找到一种方法来排除 CreateFromDirectory 中的空文件夹。

【讨论】:

    【解决方案2】:

    或者,我可以从创建的 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());
            }
    

    【讨论】:

    • 如果您想在代码中保持准确的结构(用空文件夹替换空文件),请将 emptyFolders.ForEach(f =&gt; f.Delete()); 更改为 emptyFolders.ForEach(f =&gt; { f.Delete(); za.CreateEntry(f.FullName.Substring(0, f.FullName.Length - 1) + "/"); });
    猜你喜欢
    • 2012-10-16
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多