我应该使用AppDomain.CurrentDomain.BaseDirectory还是System.Environment.CurrentDirectory?


86

我在同一文件夹中有两个exe文件,我可以从exe1中的一个按钮运行exe2。今天,我通过一个远程(终端服务)会话观察一个客户,并且exe2未能运行“找不到文件”错误,但是当我们检查时exe1位于同一目录中。所以我应该使用AppDomain.CurrentDomain.BaseDirectorySystem.Environment.CurrentDirectory吗?

谢谢


@Jade M您如何在终端上执行exe1?
索尼娅女士(Sonia)

我想通过说string.GetFullPath(path)使用Environment.CurrentDirectory而不是来加我的两分钱,这CurrentDomain.BaseDirectory让我感到惊讶。
JBSnorro

Answers:


186

如果要在与应用程序相同的目录中查找文件,AppDomain.CurrentDomain.BaseDirectory则是正确的选择。

Environment.CurrentDirectory是一个可以在应用程序运行过程中更改的值。例如,使用默认参数,WinForms中的OpenFileDialog会将此值更改为从中选择文件的目录。


我使用button1显示OpenFileDialog,然后使用button2显示Environment.CurrentDirectory,但仍然显示调试文件夹,为什么?
雷扬

18

AppDomain.CurrentDomain.BaseDirectory返回从中加载当前应用程序域的目录。
System.Environment.CurrentDirectory返回当前系统目录。
您的情况AppDomain.CurrentDomain.BaseDirectory是最好的解决方案。


1
为了清楚起见,System.Environment.CurrentDirectory返回当前(特定于进程的)工作目录。
Oskar Berggren

14

您应该使用AppDomain.CurrentDomain.BaseDirectory

例如,在Windows Services应用程序中:

System.Environment.CurrentDirectory将返回C:\ Windows \ system32

AppDomain.CurrentDomain.BaseDirectory 将返回[Application.exe位置]

要注意的另一个重要因素是,它AppDomain.CurrentDomain.BaseDirectory是一个只读属性,而Environment.CurrentDirectory必要时可以是其他属性:

// Change the directory to AppDomain.CurrentDomain.BaseDirectory
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;   

6

据我了解,您应该使用BaseDirectoryCurrentDirectory可能会在程序执行过程中发生变化。



2

我通常使用类似:

            string AppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            AppPath = AppPath.Replace("file:\\", "");

2

几天前,我也一直在使用

Environment.CurrentDirectory

因为它在生产服务器上给我带来了问题,但在我的本地服务器上工作正常,

所以,我尝试了

System.AppDomain.CurrentDomain.BaseDirectory;

它在两个环境中都对我有效。

因此,正如所有人都说过的那样,我们应该始终与

System.AppDomain.CurrentDomain.BaseDirectory;

因为它会检查“当前域”目录中的路径。

看更多信息

在服务器上找不到路径错误的一部分

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.