我正在使用 .Net 4.5.2 System.IO.Compression.ZipArchive 类处理一些第 3 方 ZIP 文件,并且一切正常。
但是,我需要将文件条目与目录条目区分开来,最好不要先提取它们。
有没有办法判断一个 ZipArchive 条目是否是一个目录而不提取它?
据发现,ZipArchiveEntry 没有属性可以告诉它是文件还是目录。
我正在使用 .Net 4.5.2 System.IO.Compression.ZipArchive 类处理一些第 3 方 ZIP 文件,并且一切正常。
但是,我需要将文件条目与目录条目区分开来,最好不要先提取它们。
有没有办法判断一个 ZipArchive 条目是否是一个目录而不提取它?
据发现,ZipArchiveEntry 没有属性可以告诉它是文件还是目录。
似乎我真的倾向于回答我自己的问题。
无论如何,答案是直截了当的:
如果ZipArchiveEntry
是一个目录,它将具有FullName
以“/”结尾的属性(例如“some_dir/”),其Name
属性将为空字符串(“”)。
如果只有有人愿意将该信息放入文档中...
哦,还有一个问题:
如果目录包含文件,则不必为它单独ZipArchiveEntry
设置。
因此,如果您正在寻找一个特定的目录,您不能只寻找一个ZipArchiveEntry
带有空Name
或末尾带有“/”的目录FullName
- 您必须解析整个树(FullName
对于每个目录ZipArchiveEntry
)。
幸运的是,我只需要检查所有条目是否有一个公共目录(所有项目FullName
的属性都ZipArchiveEntry
应该以“folder_name/”形式的相同字符串开头)。
ICSharpZipLib 是这样做的:
public bool IsDirectory
{
get
{
int nameLength = name.Length;
bool result =
((nameLength > 0) &&
((name[nameLength - 1] == '/') || (name[nameLength - 1] == '\\'))) ||
HasDosAttributes(16)
;
return result;
}
}
public bool IsFile
{
get
{
return !IsDirectory && !HasDosAttributes(8);
}
}
可以将这些编写为 ZipArchiveEntry 的扩展方法