gpt4 book ai didi

c# - 压缩包 : Entry name problems

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:43 27 4
gpt4 key购买 nike

我遇到了两个关于 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);
    }
    }

级别本身并不重要,如果我向下一个级别(“dir1/dir2/”)也会发生同样的情况。

  1. 缺少条目我错误地将斜杠作为目录或文件名的第一个字符。这两个条目在 Entries 属性中也可见,但在 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);
    }
    }

你们有没有遇到过这个问题?是只有ZIP能做到,而没有应用程序能显示的问题,还是创建例程没有正确处理的错误?

谢谢马丁

最佳答案

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


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

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

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

解决方案是不要尝试创建目录。那是行不通的。只需用您想要的目录路径编写条目。这些目录是根据在这些目录中命名的实际项目隐式“创建”的。


就前导 / 字符而言,根据规范,.zip 存档中的所有文件路径都应该是“相对的”,即它们不应包含前导 / 字符。 The MSDN documentation甚至特别指出:

The entryName string should reflect the relative path of the entry you want to create within the zip archive. There is no restriction on the string you provide. However, if it is not formatted as a relative path, the entry is created, but you may get an exception when you extract the contents of the zip archive.

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

关于c# - 压缩包 : Entry name problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562061/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com