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

本文关键字:最佳 方法 路径 应用程序 文件夹 获取 | 更新日期: 2023-09-27 17:56:53

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

  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 应用程序中,它将是包含应用程序的 VSTO 托管程序集的目录,而不是 Excel 可执行文件的路径。

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

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

更新如今(.NET Core,.NET Standard 1.3+或.NET Framework 4.6+),最好使用AppContext.BaseDirectory而不是AppDomain.CurrentDomain.BaseDirectory。 两者是等效的,但不再支持多个应用程序域。

  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 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"的 Web 应用程序

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

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

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

Application.StartupPath

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

System.IO.Directory.GetCurrentDirectory()

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

对于 Web 应用程序,

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

HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

以上代码说明

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

对于上述问题中的所有 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

也许这对你们中的一些人有帮助,当你搜索适合你情况的最佳变量时,做同样的事情。

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

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase会给你垃圾箱文件夹
  2. Directory.GetCurrentDirectory()在.Net Core上工作正常,但不能在.Net上运行良好,并将为您提供项目的根目录
  3. System.AppContext.BaseDirectoryAppDomain.CurrentDomain.BaseDirectory在.Net中工作正常,但不能在.Net核心中工作正常,并将为您提供项目的根目录

在应该 target.Net 和 .Net core 的类库中,我检查哪个框架托管库并选择其中一个。

获取我使用的简单桌面应用程序的.exe路径

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

返回路径.exe .
另请注意,对于多个域,将返回默认域的.exe,或者.exe由第一次调用ExecuteAssembly(String)执行,如果条目不受管理,则将返回null

小心GetExecutingAssembly(),命名对我来说很混乱,因为我期望得到.exe,但它返回.dll.exe,代码放置的位置,所以如果GetExecutingAssembly()放置在库中,它会返回库。

我已经成功地使用了这个

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

它甚至可以在 linqpad 中工作。

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

string rootPath = Path.GetPathRoot(Application.StartupPath)

根目录:

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

这个System.IO.Path.GetDirectory(Application.ExecutablePath)更改为System.IO.Path.GetDirectoryName(Application.ExecutablePath)