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

Leo*_* Vo 470 .net c#

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

  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)

取决于具体情况,最好的方法是什么?

Joe*_*Joe 481

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

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

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

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

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

  • @avenmore - 如果要格式化字符串以构建路径,请考虑使用`Path.Combine`.这将为您处理尾随反斜杠. (16认同)
  • 这也适用于配备Xamarin的Mac. (3认同)
  • 请注意,这会返回一个末尾带有反斜杠的路径.当格式化字符串并将结果作为进程参数传递时,这会导致我出现问题. (3认同)
  • 在Windows XP 32bit中进行测试时,它将返回快捷方式开始的位置。 (2认同)

Mat*_*ius 76

  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. AppDomain.CurrentDomain.BaseDirectory对于Web应用程序可能很有用,并将返回类似于"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对于可能的Web应用程序,将为您提供运行代码的位置"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

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

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

  • 绝对可以肯定,想要“当前文件夹”仅与非Web应用程序相关... (2认同)
  • 这就是答案。 (2认同)

Vim*_*987 59

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

Application.StartupPath
Run Code Online (Sandbox Code Playgroud)

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

System.IO.Directory.GetCurrentDirectory()
Run Code Online (Sandbox Code Playgroud)

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

  • 请不要使用`GetCurrentDirectory()`,因为喜欢从不同的路径跑步!:( (7认同)

Raj*_*mar 8

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

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
Run Code Online (Sandbox Code Playgroud)

以上代码说明


Bee*_*tee 6

我在来自实际登录的用户的会话中通过 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
Run Code Online (Sandbox Code Playgroud)

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

  • 非常相关的答案。很多人忘记了“工作目录”!=“程序目录”。 (4认同)

Ahm*_*our 5

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

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase 会给你bin文件夹
  2. Directory.GetCurrentDirectory() 在 .Net Core 上工作正常,但在 .Net 上不工作,并且会给你项目的根目录
  3. System.AppContext.BaseDirectory并且AppDomain.CurrentDomain.BaseDirectory 在 .Net 中工作正常,但在 .Net core 中不能正常工作,并且会为您提供项目的根目录

在应该针对 .Net 和 .Net 核心的类库中,我检查托管库的框架并选择其中一个。