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

我看到有一些方法来获取应用程序文件夹path:

  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)

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

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中尤其如此)。

  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. 用于Web应用程序的AppDomain.CurrentDomain.BaseDirectory可能会很有用,并会返回类似于"C:\\hg\\Services\\Services\\Services.Website\\"这是基本目录,并且非常有用。

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

会得到你的位置的进程被解雇 – 所以对于从Visual Studiodebugging模式下运行的Web应用程序,如"C:\\Program Files (x86)\\IIS Express"

  1. 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; 

以上代码说明

例如:

  1. button:[名称 – ' btn_OpenFile ']
  2. 我有'abc.exe',我想要打开。
  3. 文件path: C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.

所以,我会做以下事情:

  1. 在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)