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

保存文件至wwwroot时触发DirectoryNotFoundException问题求助

解决FileStream实例化时的DirectoryNotFoundException异常

这个问题很常见——当你尝试创建文件但目标目录不存在时,FileStream就会抛出DirectoryNotFoundException,因为它不会自动帮你创建缺失的父目录。咱们来一步步修复你的代码:

问题根源

你当前的代码直接拼接出完整文件路径后就尝试创建FileStream,但如果_configuration["SydneyFloorplanPath"]指向的目录(比如WebRootPath/uploads/sydney)还不存在,系统找不到这个目录,自然就会抛出异常。

修复方案

在创建FileStream之前,先提取并确保目标目录存在:

[HttpPost]
public IActionResult Upload(string office, IFormFile file) {
    if (file.Length > 0) {
        // 拼接完整文件路径
        var filePath = Path.GetFullPath(Path.Combine(_environment.WebRootPath, _configuration["SydneyFloorplanPath"]));
        
        // 提取文件所在的目录路径
        var directoryPath = Path.GetDirectoryName(filePath);
        
        // 如果目录不存在则创建(已存在也不会报错)
        if (!string.IsNullOrEmpty(directoryPath))
        {
            Directory.CreateDirectory(directoryPath);
        }
        
        // 现在可以安全创建FileStream并写入文件了
        using (var fileStream = new FileStream(filePath, FileMode.Create)) {
            file.CopyTo(fileStream);
        }
    }
    return RedirectToAction("Index", new{office = office});
}

额外注意事项

  • 确认_configuration["SydneyFloorplanPath"]的配置值:它应该是包含文件名的完整相对路径(比如"uploads/floorplans/sydney.png")。如果配置的只是目录(比如"uploads/floorplans"),那你需要把上传文件的文件名也拼接进去,否则会把目录当成文件名,导致错误:
    var filePath = Path.GetFullPath(Path.Combine(_environment.WebRootPath, _configuration["SydneyFloorplanPath"], file.FileName));
    
  • Directory.CreateDirectory()是安全的:如果目录已经存在,它不会抛出异常,也不会修改现有目录,所以不用额外做复杂的存在性判断(上面代码里的判断只是为了处理directoryPath为空的极端情况)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:53:38