获取 ZipFile 根目录下的文件夹数量

Posted

技术标签:

【中文标题】获取 ZipFile 根目录下的文件夹数量【英文标题】:Get number of folders in root of ZipFile 【发布时间】:2016-04-28 08:42:41 【问题描述】:

我正在尝试检查我的 zip 是否有效

zip 文件如下所示(只有一个包含内容的根文件夹):

zip-root
`-- folder1
    |-- folder1
    |-- folder2
    |-- folder3
    |-- folder4
    `-- folder5

压缩文件的结构被认为是无效如果

zip 根目录包含多个文件夹

我尝试了以下方法:

using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath))

    rootArchiveFolder = archive.Entries.Count();        

但这会返回所有文件夹的计数,而我只对 root-folder-count

感兴趣

【问题讨论】:

【参考方案1】:

问题是条目列表是扁平的。但是使用此过滤器,您应该能够获得根文件夹计数。

int foldersCount;
using (var zip = ZipFile.OpenRead(file))

    foldersCount = zip.Entries.Count(e => e.FullName.Split('/').Length == 3 && e.FullName.EndsWith("/"));

【讨论】:

不幸的是,当有两个根文件夹时,这将不起作用,一个是空的,另一个是文件和子文件夹。 @Nino 我在根目录下使用了两个文件夹(一个为空,一个包含子文件夹和文件)对其进行了测试。它奏效了。 删除 Count 并将其放在 Where 中,这样您就会误报。 .FullName.Split('/').Length == 3 将在第二级找到子文件夹。即,(root) folder1/folder1/ 在 Sveta 的示例中。 @Nino 不,它不会因为空的二级文件夹将返回拆分长度 4.. 这是因为空的二级文件夹以正斜杠结尾 二级文件夹写为folder1/folder2/。 Split 将返回包含三个元素的数组:“folder1”、“folder2”和“”(空字符串)。如果.Length == 2,我认为您的代码将起作用。这样它就可以工作,而且比我的版本更简单。【参考方案2】:

以斜杠 (/) 结尾的 FullName 识别文件夹。 因此,在您的情况下,您可以像这样获取存档根目录中的文件夹列表:

using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath)

    var listOfZipFolders = archive.Entries.Where(x => x.FullName.EndsWith("/")).ToList();
    int foldersCount = archive.Entries.Count(x => x.FullName.EndsWith("/"));

或者,LINQless 版本:

using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath))

    List<ZipArchiveEntry> listOfZipFolders = new List<ZipArchiveEntry>();
    foreach (ZipArchiveEntry entry in archive.Entries)
    
        if (entry.FullName.EndsWith("/"))
            listOfZipFolders.Add(entry);
    
    int foldersCount = listOfZipFolders.Count;

编辑:之前的代码示例仅适用于空文件夹。

这将找到根文件夹列表(空、非空或有子文件夹)

var folders = archive.Entries
    .Where
        (x => x.FullName.Split('/').Length > 1 || 
           x.FullName.EndsWith("/")
        )
    .Select(f => f.FullName.Split('/')`[0])
    .Distinct()
    .ToList();

var foldersCount = archive.Entries
    .Where
        (x => x.FullName.Split('/').Length > 1 || 
           x.FullName.EndsWith("/")
        )
    .Select(f => f.FullName.Split('/')`[0])
    .Distinct()
    .Count()

【讨论】:

它仍然不起作用:我有有效的存档,其中包含一个根文件夹,里面有 5 个文件夹。 foldersCount = 6,不是一个 您应该计算以 / 结尾且仅包含一个 / 的项目 看起来我的代码只适用于空文件夹。我添加了适用于所有场景的版本(根目录中的一个或多个文件夹包含 n 个文件夹和/或文件)。

以上是关于获取 ZipFile 根目录下的文件夹数量的主要内容,如果未能解决你的问题,请参考以下文章

python中的zipfile?

在 zipfile 中递归列出所有目录而不在 python 中提取

Linux 查看目录下的文件数量

使用 ZipFile 类从多个文件的 zip 存档中解压缩文件

统计目录下的文件数量

linux 命令 文件数量统计