获取应用程序文件夹path的最佳方法
我看到有一些方法来获取应用程序文件夹path:
- Application.StartupPath
-  System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
-  AppDomain.CurrentDomain.BaseDirectory
-  System.IO.Directory.GetCurrentDirectory()
-  Environment.CurrentDirectory
-  System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
-  System.IO.Path.GetDirectory(Application.ExecutablePath)
根据情况,最好的方法是什么?
  AppDomain.CurrentDomain.BaseDirectory对于访问位置相对于应用程序安装目录的文件可能是最有用的。 
在ASP.NET应用程序中,这将是应用程序根目录,而不是bin子文件夹 – 这可能是您通常需要的。 在客户端应用程序中,它将是包含主要可执行文件的目录。
在VSTO 2005应用程序中,它将是包含应用程序的VSTOpipe理程序集的目录,而不是指向Excel可执行文件的path。
其他人可能会根据您的环境返回不同的目录 – 例如请参阅@ Vimvq1987的答案。
  CodeBase是find文件的地方,可以是以http://开头的URL。 在这种情况下, Location可能是程序集下载caching。  CodeBase不保证在GAC中为程序集设置。 
请注意,并非所有这些方法都会返回相同的值。 在某些情况下,他们可以返回相同的价值,但要小心,他们的目的是不同的:
 Application.StartupPath 
 返回StartupPath参数(可以在运行应用程序时设置) 
 System.IO.Directory.GetCurrentDirectory() 
 返回当前目录,该目录可能是也可能不是应用程序所在的文件夹。  Environment.CurrentDirectory 。 如果您在DLL文件中使用它,它将返回进程运行的path(在ASP.NET中尤其如此)。 
- 
Application.StartupPath和7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)– 仅适用于Windows窗体应用程序
- 
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"这是你正在运行的页面的位置。
- 
用于Web应用程序的 AppDomain.CurrentDomain.BaseDirectory可能会很有用,并会返回类似于"C:\\hg\\Services\\Services\\Services.Website\\"这是基本目录,并且非常有用。
- 
System.IO.Directory.GetCurrentDirectory()和5.Environment.CurrentDirectory
 会得到你的位置的进程被解雇 – 所以对于从Visual Studiodebugging模式下运行的Web应用程序,如"C:\\Program Files (x86)\\IIS Express" 
-  System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
 将得到您的位置.dll运行的代码是,对于Web应用程序,可能是"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin" 
 现在例如控制台应用程序点2-6将是.exe文件所在的目录。 
希望这可以为你节省一些时间。
对于Web应用程序,要获取当前的Web应用程序根目录,一般通过Web页面调用当前的传入请求:
 HttpContext.Current.Server.MapPath(); System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; 
以上代码说明
例如:
-  button:[名称 – ' btn_OpenFile']
- 我有'abc.exe',我想要打开。
-  文件path: C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.
所以,我会做以下事情:
-  在Button Click事件中: btn_OpenFile_Click()
 Process.Start(@Environment.CurrentDirectory+"\\..\\..\\abc.exe"); 
 注意:“Environment.CurrentDirectory”返回此path: "C:\\Users\\Admin\\Documents\\Visual Studio 2015\\Projects\\MyProject\\MyProject\\bin\\Debug" 
 所以,通过把"\\.."这个,你可以去更高的目录。 
我从用户实际login(在任务pipe理器会话1中不是0)的用户会话中从Windows服务启动了Windows服务。 在这是我们可以知道,哪个variables是最好的。
对于上述问题的全部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 
当你为你的案例search最好的variables时,也许对你们中的一些人有帮助,做同样的事情。
我已经成功地使用了这个
 System.IO.Path.GetDirectoryName(Process.GetCurrentProcess).MainModule.FileName) 
它甚至可以在linqpad里面工作。
这一个“System.IO.Path.GetDirectory(Application.ExecutablePath)”更改为System.IO.Path.GetDirectoryName(Application.ExecutablePath)