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

时间:2016-04-28 08:42:41

标签: c# .net asp.net-mvc zipfile

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

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

script

如果

,则zip文件的结构被视为无效
  • zip的根目录包含多个文件夹

我尝试了以下内容:

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

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

感兴趣

2 个答案:

答案 0 :(得分:1)

问题是条目列表是扁平的。但是使用此过滤器,您应该能够获得root-folder-count。

int foldersCount;
using (var zip = ZipFile.OpenRead(file))
{
    foldersCount = zip.Entries.Count(e => e.FullName.Split('/').Length == 3 && e.FullName.EndsWith("/"));
}

答案 1 :(得分:0)

文件夹被识别,其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()