在我的控制台应用上,相对路径不起作用,但为什么?

on my console app the relative path doesn't work, but why?

提问人:willian kennedy 提问时间:11/5/2023 更新时间:11/7/2023 访问量:38

问:

我正在学习 C#。我正在使用 vs code 和控制台应用程序研究 TraceSwitch 和 Microsoft 配置扩展的用法,但由于某种原因,相对路径不起作用。

项目结构 项目结构

代码如下:

...
// The error is here
const string APP_SETTINGS = @"appsettings.json";

if (File.Exists(APP_SETTINGS))
{
    ....
    //rest of the code
    ....
}
else
{
    Console.WriteLine("File doesn't exist");
}

唯一有效的方法是使用完整的路径:

const string APP_SETTINGS = @"C:\Users\myUser\source\repos\cs11dotnet7\Chapter04-vscode\Instrumenting\appsettings.json";

但是为什么?我正在使用的书是使用相对路径的。我尝试了相对路径:

./ / .
\

但没有任何效果。

C# 文件 路径 跟踪

评论

1赞 Flydog57 11/5/2023
当您通过相对路径(如 (as.j))访问文件时,访问是相对于当前工作目录 (CWD) 的。程序可以在运行时更改 CWD,但默认情况下,它是程序启动的位置(可能在 .\ bin\debug 中,相对于源文件夹)。我猜您的 as.j 文件位于您的源文件夹中。它会被复制到你前任的文件夹吗?如果没有,请通过查看文件的属性并设置“始终复制”来强制执行"appsettings.json"
0赞 Ňɏssa Pøngjǣrdenlarp 11/5/2023
您可以将当前目录捕获到一个变量中进行查看,以诊断这项运动。始终首先检查您的假设。另请注意,许多事情都可以更改 CWD,例如使用文件/文件夹浏览对话框
0赞 Flydog57 11/5/2023
在代码中放置一个临时调用,然后将调试器中看到的内容与预期内容(以及看到文件的位置)进行比较。请记住,您正在运行的程序不知道源文件的位置Path.GetFullPath

答:

0赞 willian kennedy 11/7/2023 #1

问题是程序从路径“.bin\debug\net7.0”运行。为了解决这个问题,我进行了以下更改:

我将以下代码添加到 .csproj 文件以更新程序的属性:

    <ItemGroup>
       <None Update="appsettings.json">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       </None>  
   </ItemGroup>

此代码确保将“appsettings.json”文件复制到应用程序的输出目录。

通过执行此操作,文件现在被复制到应用程序的工作目录,从而解决了问题。

我找到的另一个解决方案是手动将“json”文件移动到适当的目录。

谢谢你的帮助!