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

我看到有一些方法来获得应用程序文件夹路径:

  1. # EYZ0
  2. <李> <代码> System.IO.Path.GetDirectoryName ( System.Reflection.Assembly.GetExecutingAssembly () .Location) < /代码> < /李>
  3. # EYZ0
  4. # EYZ0
  5. # EYZ0
  6. <李> <代码> System.IO.Path.GetDirectoryName ( System.Reflection.Assembly.GetExecutingAssembly () . getname () .CodeBase) < /代码> < /李>
  7. # EYZ0

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

762143 次浏览

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

Application.StartupPath

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

System.IO.Directory.GetCurrentDirectory()

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

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

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

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

其他选项可能会根据您的环境返回不同的目录—例如,请参阅@Vimvq1987的答案。

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

<强>更新 这些天….NET Core, .NET Standard 1.3+或.NET Framework 4.6+)最好使用AppContext.BaseDirectory而不是AppDomain.CurrentDomain.BaseDirectory。两者都是等价的,但是不再支持多个appdomain.

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

HttpContext.Current.Server.MapPath();


System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

以上代码描述 .

  1. # EYZ0and 7。System.IO.Path.GetDirectoryName(Application.ExecutablePath) -只会工作于Windows窗体应用程序

  2. <李> < p > <代码> System.IO.Path.GetDirectoryName ( System.Reflection.Assembly.GetExecutingAssembly () .Location) < /代码> < / p >

    会给你一些东西,比如:"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。# EYZ1

会让你的位置,从哪里进程被解雇-所以web应用程序运行在调试模式从Visual Studio之类的"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"

现在,以控制台应用为例,point2 -6将是.exe文件所在的目录。

希望这能为您节省一些时间。

我在会话中通过Win32 API从Windows服务启动了一个进程,从实际登录的用户(在任务管理器会话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

也许这对你们中的一些人是有帮助的,当你为你的情况寻找最佳变量时。

我成功地用过这个

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

它甚至可以在linqpad。中工作

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

根据我的经验,最好的方法是两者结合。

    <李> # EYZ0 会给你bin文件夹 <李> # EYZ0 在。net Core上可以正常工作,但在。net上不行,会给你项目的根目录
  1. System.AppContext.BaseDirectoryAppDomain.CurrentDomain.BaseDirectory 在。net中工作正常,但在。net core中工作不正常,并且会给你项目的根目录

在一个类库中。我检查哪个框架托管库,并选择一个或另一个。

如果你知道根目录:

string rootPath = Path.GetPathRoot(Application.StartupPath)

根目录:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
获取我使用的简单桌面应用程序.exe的路径

Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)

返回路径.exe
还要注意,对于一些域,默认域的.exe将被返回,或者第一次调用ExecuteAssembly(String)执行的.exe,以及如果该条目是非托管的null将被返回

小心使用GetExecutingAssembly(),命名让我感到困惑,因为我希望得到.exe,但它返回代码所在的.dll.exe,因此在GetExecutingAssembly() 放置于图书馆的情况下,它返回库。