获取应用程序文件夹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)