获取 ZipFile 根目录中的文件夹数
Get number of folders in root of ZipFile
我正在尝试检查我的 zip 是否有效。
zip 文件如下所示(只有一个包含内容的根文件夹):
zip-root
`-- folder1
|-- folder1
|-- folder2
|-- folder3
|-- folder4
`-- folder5
zip 文件的结构被认为是无效 if
- zip 根目录包含多个 文件夹
我尝试了以下方法:
using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath))
{
rootArchiveFolder = archive.Entries.Count();
}
但是这个 returns 所有文件夹的计数,而我只对 root-folder-count
感兴趣
文件夹被识别为 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()
问题是条目列表是扁平的。但是使用此过滤器,您应该能够获得根文件夹计数。
int foldersCount;
using (var zip = ZipFile.OpenRead(file))
{
foldersCount = zip.Entries.Count(e => e.FullName.Split('/').Length == 3 && e.FullName.EndsWith("/"));
}
我正在尝试检查我的 zip 是否有效。
zip 文件如下所示(只有一个包含内容的根文件夹):
zip-root
`-- folder1
|-- folder1
|-- folder2
|-- folder3
|-- folder4
`-- folder5
zip 文件的结构被认为是无效 if
- zip 根目录包含多个 文件夹
我尝试了以下方法:
using (ZipArchive archive = ZipFile.OpenRead(ZipFilePath))
{
rootArchiveFolder = archive.Entries.Count();
}
但是这个 returns 所有文件夹的计数,而我只对 root-folder-count
感兴趣文件夹被识别为 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()
问题是条目列表是扁平的。但是使用此过滤器,您应该能够获得根文件夹计数。
int foldersCount;
using (var zip = ZipFile.OpenRead(file))
{
foldersCount = zip.Entries.Count(e => e.FullName.Split('/').Length == 3 && e.FullName.EndsWith("/"));
}