获取当前文件夹路径


222

我想创建一个转换文件的程序。我希望用户能够将可执行文件放置在任何目录中,并且在执行该程序(双击.exe)时,我希望该程序处理exe文件所在的当前文件夹中的所有文件。程序如何确定当前正在执行的路径?

我尝试过,System.Windows.Forms.Application.StartupPath但这似乎是错误的方式。

有任何想法吗?

Answers:


334

你应该使用Directory.GetCurrentDirectory()你的情况,当前目录可以从执行文件夹不同,尤其是当你通过一个快捷方式执行程序。

最好Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);用于您的目的。这将返回当前正在执行的程序集所在的路径名。

正如SonerGönül在回答中所说的,虽然我建议的方法使您可以区分执行程序集,输入程序集或任何其他加载的程序集,

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

可能也足够。这等于

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly()和GetExecutingAssembly()有一个有趣的区别。有关详细信息,请参阅stackoverflow.com/a/18562036/30289
bhadra 2013年

3
正如我所说:这将返回当前正在执行的程序集所在的路径名。函数名称GetEntryAssembly和之间的区别GetExecutingAssembly也就不足为奇了。如果他们做的相同,为什么要有两个功能?:-)
Thorsten Dittmar

2
+1 Assembly.GetEntryAssembly()帮助我通过clickonce运行了应用程序
Artiom 2014年

9
这是在System.Reflection中,所以System.Reflection.Assembly.GetExecutingAssembly().Location它也是完整的-如果您从即时窗口进行测试
红豌豆

146
System.AppDomain.CurrentDomain.BaseDirectory

这将为您提供应用程序的运行目录。这甚至适用于Web应用程序。之后,您可以访问文件。


9
这是用于此目的的最准确的属性。即使动态创建AppDomain来从其他位置查找程序集,CurrentDomain的BaseDirectory也将始终指向正确的位置。
dhruvin

完善。这对于任何应用程序都是独立运行的,尤其是在使用Streamreader时,它可以根据应用程序类型读取不同的绝对路径。
user3326078'1

40

我使用以下代码创建了一个简单的控制台应用程序:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

我将生成的可执行文件复制到C:\temp2。然后,我在中放置了该可执行文件的快捷方式C:\temp3,并运行了它(一次是从exe本身,一次是从该快捷方式)。两次都提供了以下输出:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

虽然我敢肯定,必须有一些繁琐的理由来解释为什么有五种不同的方法是做几乎同样的事情,我当然不知道它是什么。但是,在大多数情况下,您似乎可以自由选择自己喜欢的任何一种。

更新: 我修改了快捷方式属性,将“开始于:”字段更改为C:\temp3。结果为以下输出:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

...这证明了不同方法之间的至少一些区别。


2
非常感谢你。
baj9032

重要说明。工作目录并不总是与安装目录相同。
乔丹



19

用这个,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

您也可以使用它。

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

8

对于.NET CORE使用System.AppContext.BaseDirectory

(代替AppDomain.CurrentDomain.BaseDirectory


6

1。

Directory.GetCurrentDirectory();

2。

Thread.GetDomain().BaseDirectory

3。

Environment.CurrentDirectory

Environment.CurrentDirectory可以通过多种方式进行更改...(shotrtcut设置等)
Yousha Aleayoub


0

如果您想要exe路径,可以使用 System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

这对我来说最有效,尤其是在使用dotnet core单个文件发布时。 Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

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.