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

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

他们都给出了相同的结果

他们当然不会。 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属性再次获取路径,该属性提供了程序集文件的物理路径。

在此处输入图像描述

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

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

结果如下

AppDomain.CurrentDomain.BaseDirectory

 D:\ 

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()位置)

 F:\ 

Environment.CurrentDirectory和Directory.GetCurrentDirectory()

 C:\ 

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

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