29

它们都给出相同的结果,即包含正在执行的 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);
4

3 回答 3

25

他们都给出相同的结果

他们当然不会。currentDir并且dir两者都给你当前的工作目录——即默认情况下你的可执行文件运行的目录但它可以在执行期间更改)。

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

为了说明它们有何不同,请考虑您有一个位于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路径,它给出了一个程序集文件的物理路径。

于 2013-09-10T19:59:46.227 回答
23

在此处输入图像描述

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

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

这是结果

AppDomain.CurrentDomain.BaseDirectory

D:\

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)

F:\

Environment.CurrentDirectory 和 Directory.GetCurrentDirectory()

C:\
于 2013-09-10T21:14:24.730 回答
4

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

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

于 2013-09-10T20:00:43.147 回答