You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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);
    }
}

额外验证建议

  1. 确认目标路径的绝对位置:可以在代码中加入Console.WriteLine(Path.GetFullPath(projectPath));,输出projectPath对应的绝对路径,确保这个路径是你预期的位置,且有写入权限。
  2. 检查压缩包结构:打开压缩包确认里面的文件路径是相对路径,没有包含绝对路径或特殊字符(比如冒号、斜杠方向错误等)。

内容的提问来源于stack exchange,提问作者Inception

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:52