C# Zip存档:条目名称问题

C# Zip存档:条目名称问题,c#,.net,zip,C#,.net,Zip,我在使用zip存档时遇到了两个问题,我想在这里与大家分享,并征求大家的意见: 重复目录 如果我在归档文件(根目录下)中创建两个或多个同名目录,则归档文件包含两个目录(查找条目时),但每个ZIP应用程序(以及Windows)仅显示一个目录。我是这样做的: using (ZipArchive a = ZipFile.Open("D:\\zip.zip", ZipArchiveMode.Update)) { ZipArchiveEntry e1 = a.CreateEntry("dir1/")

我在使用zip存档时遇到了两个问题,我想在这里与大家分享,并征求大家的意见:

  • 重复目录 如果我在归档文件(根目录下)中创建两个或多个同名目录,则归档文件包含两个目录(查找条目时),但每个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);
        }
    }
    
  • 级别本身并不重要,如果我降低一级(“dir1/dir2/”),同样的情况也会发生

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

  • 你们中有谁经历过这个问题吗?这只是一个问题,ZIP可以做到这一点,但没有应用程序能够显示它,或者这是一个错误,没有正确处理的创建例程

    谢谢
    马丁

    这两种行为都是完全正常的。它们产生于您对.zip归档工作方式的误解,尤其是对
    ZipArchive
    的操作方式的误解


    首先,正如我在回答您的另一个
    ZipArchive
    问题时所提到的,在.zip存档中实际上没有任何“目录”。它们仅通过在名称中使用目录名创建的条目而存在

    因此,如果您添加一个名为
    dir1/dir2/test1.txt的条目,就会得到名为
    dir1
    dir2
    的“目录”。如果删除该条目,这些目录就会消失

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

    解决方案是不要尝试创建目录。那不行。只需使用所需的目录路径编写条目。通过将实际项目命名为这些目录中的项目,可以隐式地“创建”目录


    就前导的
    /
    字符而言,按照规范,.zip存档中的所有文件路径都应该是“相对的”,也就是说,它们不应该包含前导的
    /
    字符。甚至明确指出:

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


    在您的情况下,似乎没有发生异常,但在其他工具中打开存档时,您根本无法访问存档条目。解决办法是,“不要那样做”。

    谢谢你,彼得。我写了一个关于这个的包装,但在我完成包装之前,我需要一些信息。现在我得到了这些信息,我可以防止包装中的误用。
    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);
        }
    }