它们都给出相同的结果,即包含正在执行的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);
答案 0 :(得分:22)
他们都给出相同的结果
他们当然不会。 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
属性来再次获取其路径,该属性提供了汇编文件的物理路径。
答案 1 :(得分:15)
考虑上面的例子
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指向的位置。