【问题标题】:How to tell if a "ZipArchiveEntry" is directory?如何判断“ZipArchiveEntry”是否是目录?
【发布时间】:2016-10-24 16:44:20
【问题描述】:

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

有没有办法在不解压的情况下判断 ZipArchive 条目是否为目录?

据我们所知,ZipArchiveEntry 没有属性可以判断它是文件还是目录。

【问题讨论】:

    标签: .net zip system.io.compression


    【解决方案1】:

    看来我确实倾向于回答自己的问题。

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

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

    如果有人愿意将这些信息放入文档中...

    哦,还有一个陷阱
    如果目录包含文件,则不必必须为它提供单独的ZipArchiveEntry
    所以,如果你正在寻找一个特定的目录,你不能只寻找一个 ZipArchiveEntry 空的 NameFullName 末尾的“/” - 你必须解析整个树(FullName 为每个ZipArchiveEntry)。

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

    【讨论】:

    • 为了安全起见,我总是检查 FullName 的 '\' 和 '/',特别是因为 ZipArchive 本身已损坏,并且会保存你扔给它的任何东西,而不像标准所说的那样规范化使用 '/' .
    【解决方案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 的扩展方法

    【讨论】:

    • Here 是 github 上 ICSharpZipLib 的 ZipEntry
    猜你喜欢
    • 2014-04-12
    • 2017-01-06
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多