C# 如何仅获取Zip文件顶层的文件名(排除子目录内容)
问题根因
你现在代码拿不对结果,核心是搞错了属性的作用:ZipArchiveEntry.Name 只会返回路径最末端的文件名片段,完全不携带层级信息——哪怕文件藏在好几层子目录里,通过 Name 读到的也只是最终的文件名,根本没法判断它是不是在zip的最外层。
修正方案
要准确筛出顶层文件,得靠 FullName 属性做判断:
- 这个属性存的是条目在zip包内的完整相对路径
- 所有符合规范的zip包,内部路径统一用正斜杠
/做层级分隔,只要条目路径里包含/,就说明它处在子目录层级里 - 遍历的时候要额外跳过纯目录条目:这类条目本身是文件夹,不是文件,它们的FullName一般以
/结尾,不能算在文件列表里
修正后的可运行参考代码:
using System.IO.Compression; // 项目需要提前引用对应版本的 System.IO.Compression.ZipFile 程序集 using var zip = ZipFile.OpenRead(pathToZip); var topLevelFileNames = new List<string>(); foreach (var entry in zip.Entries) { // 跳过zip内的目录条目,避免把目录名误判为文件 if (entry.FullName.EndsWith('/')) continue; // 路径里没有层级分隔符,就是顶层文件 if (!entry.FullName.Contains('/')) { topLevelFileNames.Add(entry.Name); } }
容易踩的坑
- 不要拿
Name做筛选判断,这个属性没有路径信息,完全区分不了层级 - 不要用操作系统的反斜杠
\做路径分隔判断,zip规范里统一用正斜杠,哪怕是Windows下打包的zip,内部存的路径也不会用反斜杠 - 如果你需要的是带完整相对路径的顶层条目名,直接读取
FullName就可以,不需要额外拼接
内容的提问来源于stack exchange,提问作者Christoff
相关产品推荐
相关产品推荐

