我在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 /”)也会发生同样的事情。
缺少参赛作品 我错误地将斜杠作为目录或文件名的第一个字符。这两个条目在条目属性中也可见,但在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可以做到这一点,但没有应用程序能够显示它,或者这是一个错误,创建例程没有正确处理?
由于 马丁
答案 0 :(得分:1)
这两种行为都是完全正常的。它们源于您对.zip档案的工作方式的误解,以及ZipArchive
如何运作。
首先,正如我在回答您的其他ZipArchive
问题时提到的,实际上并没有任何"目录"本身在.zip存档中。它们仅通过在名称中使用目录名创建的条目来存在。
因此,如果您添加一个名为dir1/dir2/test1.txt
的条目,您将获得"目录"名为dir1
和dir2
。如果删除该条目,那些目录就会消失。
因此,当您认为自己正在创建目录时,您实际上只是在创建新条目。正如文档所述,您可以创建多个具有相同名称的条目。当然,在这种情况下会发生什么取决于您用来打开存档的工具。许多人(正如您所发现的那样)只会向您显示第一项。
解决方案是不尝试创建目录。这不起作用。只需用您想要的目录路径写入条目。目录是"创建"隐含地凭借实际项目被命名为在这些目录中。
就前导/
字符而言,根据规范,.zip存档中的所有文件路径都应该是#34; relative",即它们不应包含前导/
字符。 The MSDN documentation甚至专门提出这个问题:
entryName字符串应反映您要在zip存档中创建的条目的相对路径。您提供的字符串没有限制。但是,如果未将其格式化为相对路径,则会创建该条目,但在解压缩zip存档的内容时可能会出现异常。
在您的情况下,似乎没有例外,但在其他工具中打开存档时,您根本无法访问存档条目。解决方案是,“不要那样做”#34;。