Zip 存档:条目名称问题
Zip Archive: Entry name problems
我遇到了两个关于 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可以做到,没有应用程序可以显示的问题,还是创建例程没有正确处理的错误?
谢谢
马丁
这两种行为都是完全正常的。它们源于您对 .zip 存档的工作方式的误解,以及 ZipArchive
特别是如何运作。
首先,正如我在回答您的其他 ZipArchive
问题时提到的那样,.zip 存档中实际上并没有 "directory" 本身。它们仅通过在名称中使用目录名称创建的条目而存在。
因此,如果您添加名为 dir1/dir2/test1.txt
的条目,您会得到名为 dir1
和 dir2
的 "directories"。如果您删除该条目,这些目录就会消失。
所以当您认为您正在创建目录时,您实际上只是在创建新条目。正如文档所说,您可以创建多个具有相同名称的条目。当然,在这种情况下会发生什么取决于您用来打开存档的工具。许多(如您所见)只会显示第一项。
解决方法是不要尝试创建目录。那是行不通的。只需用您想要的目录路径编写条目。这些目录是 "created" 隐含的,因为实际项目被命名为在这些目录中。
就前导 /
字符而言,根据规范,.zip 存档中的所有文件路径都应为 "relative",即它们不应包含前导 /
字符。 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.
在您的情况下,似乎没有发生异常,但是当在其他工具中打开存档时,您根本无权访问存档条目。解决方案是,"don't do that".
我遇到了两个关于 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可以做到,没有应用程序可以显示的问题,还是创建例程没有正确处理的错误?
谢谢 马丁
这两种行为都是完全正常的。它们源于您对 .zip 存档的工作方式的误解,以及 ZipArchive
特别是如何运作。
首先,正如我在回答您的其他 ZipArchive
问题时提到的那样,.zip 存档中实际上并没有 "directory" 本身。它们仅通过在名称中使用目录名称创建的条目而存在。
因此,如果您添加名为 dir1/dir2/test1.txt
的条目,您会得到名为 dir1
和 dir2
的 "directories"。如果您删除该条目,这些目录就会消失。
所以当您认为您正在创建目录时,您实际上只是在创建新条目。正如文档所说,您可以创建多个具有相同名称的条目。当然,在这种情况下会发生什么取决于您用来打开存档的工具。许多(如您所见)只会显示第一项。
解决方法是不要尝试创建目录。那是行不通的。只需用您想要的目录路径编写条目。这些目录是 "created" 隐含的,因为实际项目被命名为在这些目录中。
就前导 /
字符而言,根据规范,.zip 存档中的所有文件路径都应为 "relative",即它们不应包含前导 /
字符。 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.
在您的情况下,似乎没有发生异常,但是当在其他工具中打开存档时,您根本无权访问存档条目。解决方案是,"don't do that".