在 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 中保存文件时出现问题(“无法打开流:没有这样的文件或目录”)

保存数据时出现问题

使用 savefiledialog 保存图像时出现问题

尝试不重写文件并将其保存在 C# 的新位置时出现意外的系统异常

在并行环境中保存到 matfile 时出现警告

SSH远程连接Linux时出现中文乱码