36

我正在使用 .Net 4.5.2 System.IO.Compression.ZipArchive 类处理一些第 3 方 ZIP 文件,并且一切正常。
但是,我需要将文件条目目录条目区分开来,最好不要先提取它们。

有没有办法判断一个 ZipArchive 条目是否是一个目录而不提取它?

据发现,ZipArchiveEntry 没有属性可以告诉它是文件还是目录。

4

2 回答 2

60

似乎我真的倾向于回答我自己的问题。

无论如何,答案是直截了当的:

如果ZipArchiveEntry是一个目录,它将具有FullName以“/”结尾的属性(例如“some_dir/”),其Name属性将为空字符串(“”)。

如果只有有人愿意将该信息放入文档中...

哦,还有一个问题:
如果目录包含文件,则不必它单独ZipArchiveEntry设置。
因此,如果您正在寻找一个特定的目录,您不能只寻找一个ZipArchiveEntry带有空Name或末尾带有“/”的目录FullName- 您必须解析整个树(FullName对于每个目录ZipArchiveEntry)。

幸运的是,我只需要检查所有条目是否有一个公共目录(所有项目FullName的属性都ZipArchiveEntry应该以“folder_name/”形式的相同字符串开头)。

于 2016-10-25T15:14:02.003 回答
2

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 的扩展方法

于 2020-03-25T15:47:18.500 回答