Zip Archive:条目名称问题

时间:2015-05-31 19:58:14

标签: c# .net zip

我在zip存档中遇到了两个问题,我想在这里分享并询问您的体验:

  1. 重复目录 如果我在存档(根目录下)中创建两个或多个同名目录,则存档包含两个目录(查看条目时),但每个ZIP应用程序(也是Windows)只显示一个目录。我是这样做的:

    using (ZipArchive a = ZipFile.Open("D:\\zip.zip", ZipArchiveMode.Update))
    {
        ZipArchiveEntry e1 = a.CreateEntry("dir1/");
        ZipArchiveEntry e2 = a.CreateEntry("dir1/");
    
        foreach (var afile in a.Entries)
        {
            Console.WriteLine(afile.FullName);
        }
    }
    
  2. 等级本身并不重要,如果我向下一级(“dir1 / dir2 /”)也会发生同样的事情。

    1. 缺少参赛作品 我错误地将斜杠作为目录或文件名的第一个字符。这两个条目在条目属性中也可见,但在ZIP应用程序(也是Windows)上也不可见:

      using (ZipArchive a = ZipFile.Open("D:\\zip.zip", ZipArchiveMode.Update))
      {
          ZipArchiveEntry e1 = a.CreateEntry("/dir1");
          ZipArchiveEntry e2 = a.CreateEntry("/dir1.txt");
      
          foreach (var afile in a.Entries)
          {
              Console.WriteLine(afile.FullName);
          }
      }
      
    2. 你们有没有遇到过这个问题?这只是一个问题,ZIP可以做到这一点,但没有应用程序能够显示它,或者这是一个错误,创建例程没有正确处理?

      由于 马丁

1 个答案:

答案 0 :(得分:1)

这两种行为都是完全正常的。它们源于您对.zip档案的工作方式的误解,以及ZipArchive如何运作。


首先,正如我在回答您的其他ZipArchive问题时提到的,实际上并没有任何"目录"本身在.zip存档中。它们仅通过在名称中使用目录名创建的条目来存在。

因此,如果您添加一个名为dir1/dir2/test1.txt的条目,您将获得"目录"名为dir1dir2。如果删除该条目,那些目录就会消失。

因此,当您认为自己正在创建目录时,您实际上只是在创建新条目。正如文档所述,您可以创建多个具有相同名称的条目。当然,在这种情况下会发生什么取决于您用来打开存档的工具。许多人(正如您所发现的那样)只会向您显示第一项。

解决方案是不尝试创建目录。这不起作用。只需用您想要的目录路径写入条目。目录是"创建"隐含地凭借实际项目被命名为在这些目录中。


就前导/字符而言,根据规范,.zip存档中的所有文件路径都应该是#34; relative",即它们不应包含前导/字符。 The MSDN documentation甚至专门提出这个问题:

  

entryName字符串应反映您要在zip存档中创建的条目的相对路径。您提供的字符串没有限制。但是,如果未将其格式化为相对路径,则会创建该条目,但在解压缩zip存档的内容时可能会出现异常。

在您的情况下,似乎没有例外,但在其他工具中打开存档时,您根本无法访问存档条目。解决方案是,“不要那样做”#34;。