获取应用程序文件夹路径的最佳方法


514

我看到有一些方法可以获取应用程序文件夹路径:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

根据情况,最佳方法是什么?


9
为什么我们有很多方法来获取应用程序的路径。我认为每种方式都有其原因。
Leo Vo

1
#6中有错误:应读取:System.Reflection.Assembly.GetExecutingAssembly()。GetName()。CodeBase),System.IO.Path.GetDirectoryName(Application.ExecutablePath)
BillW 2014年

2
对于#6 hooray,当我在一个Web项目中时,我不希望IoC加载的库中的Server.MapPath逻辑本质上不是特定于Web的
bkwdesign

现在IHostEnvironment.ContentRootPath,我们有了可靠的,可以通过注入的IHostEnvironment依赖项(包含其他有用的东西)进行访问。
Timo

Answers:


518

AppDomain.CurrentDomain.BaseDirectory 对于访问位置相对于应用程序安装目录而言的文件而言,可能是最有用的。

在ASP.NET应用程序中,这将是应用程序的根目录,而不是bin子文件夹-这可能是您通常想要的。在客户端应用程序中,它将是包含主要可执行文件的目录。

在VSTO 2005应用程序中,它将是包含您的应用程序的VSTO托管程序集的目录,而不是Excel可执行文件的路径。

其他人可能会根据您的环境返回不同的目录-例如,参见@ Vimvq1987的答案。

CodeBase是找到文件的地方,可以是以http://开头的URL。在这种情况下,Location可能是程序集下载缓存。不保证为GAC中的程序集设置CodeBase 。


2
在Windows XP 32bit中进行测试时,它将返回快捷方式开始的位置。
约书亚儿子

1
+1 @Joe,有关VSTO文档级加载项,请参见THIS

3
请注意,这将返回路径末尾带有反斜杠的路径。这导致我在格式化字符串并将结果作为过程参数传递时遇到问题。
2015年

19
@avenmore-如果要格式化字符串以构建路径,请考虑使用Path.Combine代替。这将为您处理结尾的反斜杠。
2015年

1
这将在VS 2017中为我返回bin / debug文件夹,而不是根目录。
SmoveBB

86
  1. Application.StartupPath和7- System.IO.Path.GetDirectoryName(Application.ExecutablePath)仅适用于Windows窗体应用程序

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

    将为您提供类似的信息:"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"这是您正在运行的页面所在的位置。

  3. AppDomain.CurrentDomain.BaseDirectory对于Web应用程序可能是有用的,并且将返回诸如"C:\\hg\\Services\\Services\\Services.Website\\"基本目录之类的信息,并且非常有用。

  4. System.IO.Directory.GetCurrentDirectory() 和5。 Environment.CurrentDirectory

将为您提供触发该过程的位置-因此,对于从Visual Studio以调试模式运行的Web应用程序,例如 "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

将为您找到.dll运行代码的位置,对于可能是"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

现在,例如在控制台应用程序中,第2-6点将是文件所在的.exe 目录。

希望这可以节省您一些时间。


2
绝对可以肯定,“当前文件夹”仅与非Web应用程序相关...
Nyerguds

2
这就是答案。
P.Brian.Mackey

59

请注意,并非所有这些方法都将返回相同的值。在某些情况下,它们可以返回相同的值,但请注意,它们的用途是不同的:

Application.StartupPath

返回StartupPath参数(可以在运行应用程序时设置)

System.IO.Directory.GetCurrentDirectory()

返回当前目录,该目录可能是也可能不是应用程序所在的文件夹。同样的道理Environment.CurrentDirectory。如果您在DLL文件中使用它,它将返回进程运行的路径(在ASP.NET中尤其如此)。


7
请不要使用GetCurrentDirectory(),因为喜欢从不同的路径运行事物!:(
kayleeFrye_onDeck

@kayleeFrye_onDeck您没有提出上一个问题的原因。
nless

10

对于Web应用程序,要获取当前Web应用程序的根目录,通常通过网页调用当前传入的请求:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

以上代码说明


6

我从Windows Service通过Win32 API在实际登录用户的会话中启动了一个进程(在任务管理器会话1中不是0)。通过这个我们可以知道哪个变量是最好的。

对于上述问题的所有7个案例,结果如下:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

在搜索适合您案例的最佳变量时,也许对做同样的事情的某些人有所帮助。


4
非常相关的答案。许多人忘记了“工作目录”!=“程序目录”。
Nyerguds

3

以我的经验,最好的方法是将这些结合起来。

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase 会给你bin文件夹
  2. Directory.GetCurrentDirectory() 在.Net Core上可以正常工作,但在.Net上不能正常工作,它将为您提供项目的根目录
  3. System.AppContext.BaseDirectory并且AppDomain.CurrentDomain.BaseDirectory 在.Net而不是.Net核心中可以正常工作,并且会为您提供项目的根目录

在应该以.Net和.Net核心为目标的类库中,我检查托管该库的框架,然后选择一个或另一个。


2

我已经成功使用了这个

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

它甚至可以在linqpad内部使用。


1
这缺少GetCurrentProcess的左括号。顺便说一句,它在Visual Studio中进行调试时在.net核心项目中评估为C:\ Program Files \ dotnet,因为那是dotnet.exe所在的位置
t0b4cc0

1

根目录:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
这似乎可以获取当前的工作目录,尽管有时可能有用,但绝对不能保证它是EXE路径。
krowe2

0

如果您知道要获取根目录:

string rootPath = Path.GetPathRoot(Application.StartupPath)

0

这个System.IO.Path.GetDirectory(Application.ExecutablePath)变成了System.IO.Path.GetDirectoryName(Application.ExecutablePath)

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.