获取当前目录的这些方法有什么区别?

时间:2013-09-10 19:54:32

标签: c#

它们都给出相同的结果,即包含正在执行的exe的文件夹的位置。我确信.net BCL中没有好的或坏的方法。它们在特定情况下都是合适的。哪一个适合哪种情况?

var appBaseDir = AppDomain.CurrentDomain.BaseDirectory; 
var currentDir = Environment.CurrentDirectory; 
var dir = Directory.GetCurrentDirectory(); 
var path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

3 个答案:

答案 0 :(得分:22)

  

他们都给出相同的结果

他们当然不会。 currentDirdir都会为您提供当前工作目录 - 即默认情况下,您的可执行文件是从运行的目录(但可以在期间更改)执行)。

相比之下,appBaseDirpath获取包含正在执行的程序集文件的目录。

为了说明它们之间的区别,请考虑您有一个位于C:\bar\baz.exe的可执行文件。现在我可以通过在终端中输入以下命令链来执行应用程序:

$ md C:\foo
$ cd C:\foo
$ ..\bar\baz.exe

现在当前的工作目录是C:\foo,但应用程序的基目录是C:\bar。存在类似的方法来为启动应用程序的其他方法设置工作目录(例如,通过快捷方式图标或以编程方式,例如通过Process.Start)。

尽管如此,该框架提供了访问此信息的不同方式:

Environment.CurrentDirectory非常直接地表达了查询执行环境(环境变量)的含义。 Directory.GetCurrentDirectory() 可能在内部实际执行相同操作(我不知道),但它封装了此内容,而是专注于为用户提供用于查询目录信息的逻辑API。

AppDomain.CurrentDomain包含有关当前AppDomain(大致是可执行文件)的信息。从逻辑上讲,部分信息是AppDomain的路径。相比之下,System.Reflection.Assembly为您提供有关汇编的一般信息 - 这些代表.NET中的任何类型的二进制对象,包括DLL和EXE。 GetExecutingAssembly特别返回当前执行的程序集。您可以通过查询其Location属性来再次获取路径,该属性提供了汇编文件的物理路径。

答案 1 :(得分:15)

enter image description here

考虑上面的例子 myTest.exe文件包含入口点,位于D:\myTest.exe。这个exe通过反射调用F:\中的程序集中的方法。该程序集包含所有查找目录代码。

在命令提示符中,我将当前目录设置为C:\

以下是结果

<强> AppDomain.CurrentDomain.BaseDirectory

D:\

<强> Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()位置)

F:\

Environment.CurrentDirectory和Directory.GetCurrentDirectory()

C:\

答案 2 :(得分:4)

AppDomain.CurrentDomain.BaseDirectory将为您提供运行该应用程序的目录。

Environment.CurrentDirectory&amp; Directory.GetCurrentDirectory可以在执行应用程序期间更改。如果在执行开始时获取值,然后使用类似OpenFileDialog的内容,则可以看到行为,然后再次获取值。您会注意到该值已更改为OpenFileDialog指向的位置。