.NET Core解压Zip时出现“Could not find a part of the path”错误
解决ZipArchive解压时DirectoryNotFoundException的问题
从你描述的报错和代码来看,这个问题的核心是文件夹创建逻辑的漏洞,导致压缩包内嵌套文件夹没有被正确创建,最终提取文件时找不到对应路径。
问题根源分析
你的代码里判断entry.Name为空时认为是文件夹条目,然后调用Directory.CreateDirectory(Path.GetDirectoryName(fullPath))——这里犯了一个关键错误:当entry.FullName是类似test.edb/的文件夹路径时,fullPath就是目标文件夹的完整路径,而Path.GetDirectoryName(fullPath)会返回它的父目录(也就是D:\test\Server\project),根本没创建test.edb这个文件夹。后续提取Article.eod时,因为父文件夹test.edb不存在,自然就抛出了找不到路径的异常。
另外还有一个潜在问题:有些压缩工具不会单独生成文件夹条目,只会在文件的路径中包含文件夹层级。这种情况下,你的原代码完全不会创建这些嵌套文件夹,同样会报错。
修正后的代码
下面是调整后的代码,修复了文件夹创建逻辑,同时确保文件的父目录一定存在:
string zipPath = @".\..\..\assets\project.zip"; string projectPath = @".\..\..\project"; // 先确保根目标目录存在,避免后续嵌套目录创建失败 if (!Directory.Exists(projectPath)) { Directory.CreateDirectory(projectPath); } using (ZipArchive archive = ZipFile.OpenRead(zipPath)) { foreach (ZipArchiveEntry entry in archive.Entries) { string fullPath = Path.Combine(projectPath, entry.FullName); // 处理文件夹条目:直接创建当前路径的目录 if (string.IsNullOrEmpty(entry.Name)) { Directory.CreateDirectory(fullPath); continue; } // 处理文件条目:先确保父目录存在 string parentDirectory = Path.GetDirectoryName(fullPath); if (!Directory.Exists(parentDirectory)) { Directory.CreateDirectory(parentDirectory); } // 提取文件,覆盖已存在的文件 entry.ExtractToFile(fullPath, true); } }
额外验证建议
- 确认目标路径的绝对位置:可以在代码中加入
Console.WriteLine(Path.GetFullPath(projectPath));,输出projectPath对应的绝对路径,确保这个路径是你预期的位置,且有写入权限。 - 检查压缩包结构:打开压缩包确认里面的文件路径是相对路径,没有包含绝对路径或特殊字符(比如冒号、斜杠方向错误等)。
内容的提问来源于stack exchange,提问作者Inception
相关产品推荐
相关产品推荐

