在 Linux 中保存文件时出现 System.IO.DirectoryNotFoundException
Posted
技术标签:
【中文标题】在 Linux 中保存文件时出现 System.IO.DirectoryNotFoundException【英文标题】:System.IO.DirectoryNotFoundException when saving file in Linux 【发布时间】:2021-04-25 02:41:10 【问题描述】:我正在尝试在 Linux 中运行现有的 .NET Core 2.2 控制台应用程序。应用程序从第三方服务读取一些数据,然后将其保存为这样的文件。
var filename = Guid.NewGuid().ToString() + ".xml";
await File.WriteAllTextAsync(Path.Combine(savedir,filename), fileData);
savedir
的值是/home/ubuntu/saved/
并且该目录存在,但每次程序到达该点时我仍然收到此错误。
Exception: System.IO.DirectoryNotFoundException: Could not find a part of the path
'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/ubuntu/.dotnet/tools/12466311-7cd7-4328-8654-2dfaac1f230d.xml'.
提前致谢。
更新
感谢接受的答案,很容易找出问题所在。变量sadir初始化如下:
var path = _cfg.GetValue<string>("Path", @"/home/ubuntu/saved");
Path
的值应该来自 appsettings.json
,但在初始化代码中是这样的:
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.hostingContext.HostingEnvironment.EnvironmentName.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
似乎 .NET Framework 对环境变量的访问不区分大小写,因此我们最终将 Path
参数与环境变量 PATH
的值一起使用。
更新 2
感谢大家的cmets和回答!!!
【问题讨论】:
手动连接字符串是否有效? 刚试了一下,还是一样的错误信息 Path.Combine 调用的结果是什么?它应该类似于"/home/ubuntu/saved/f239ae55-45b2-4708-ad1b-10a86121dc2d.xml"
“试一试,它显示相同的错误消息”——这让我完全空白:-|
啊...我明白了 :-) 谢谢
【参考方案1】:
听起来它正在尝试写入此路径:
'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin :/home/ubuntu/.dotnet/tools/12466311-7cd7-4328-8654-2dfaac1f230d.xml'。
哪个不在现有目录路径中!
似乎savedir
正在从环境变量$PATH
初始化。您的程序希望该目录存在。但在您的情况下,它实际上是一个以冒号分隔的目录列表,而不是单个目录。该程序似乎希望它只包含一个目录,并且没有正确处理这种情况。
您能否分享应用程序代码中的更多详细信息? savedir
是怎么初始化的?
【讨论】:
你完全正确!!更新我的问题以显示问题以上是关于在 Linux 中保存文件时出现 System.IO.DirectoryNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中保存文件时出现问题(“无法打开流:没有这样的文件或目录”)