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

时间:2011-05-18 07:35:44

标签: c# .net

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

  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)
  8. 根据情况,最好的方法是什么?

10 个答案:

答案 0 :(得分:446)

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

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

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

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

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

答案 1 :(得分:66)

  1. Application.StartupPath和7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) - 仅适用于Windows Forms application

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

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

  6. 将为您提供进程触发位置的位置 - 因此,对于从Visual Studio以调试模式运行的Web应用程序,如"C:\\Program Files (x86)\\IIS Express"

    1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
    2. 对于可能为.dll

      的网络应用,

      会为您提供运行代码的"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"所在的位置

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

      希望这可以节省你一些时间。

答案 2 :(得分:57)

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

Application.StartupPath

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

System.IO.Directory.GetCurrentDirectory()

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

答案 3 :(得分:7)

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

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Above code description

答案 4 :(得分:1)

我成功使用了这个

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

它甚至可以在linqpad.

内部使用

答案 5 :(得分:0)

我在实际登录的用户的会话中通过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

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

答案 6 :(得分:0)

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

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

在应该以.Net和.Net核心为目标的类库中,我检查哪个框架托管该库,然后选择一个或另一个。

答案 7 :(得分:-1)

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

答案 8 :(得分:-1)

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

string rootPath = Path.GetPathRoot(Application.StartupPath)

答案 9 :(得分:-2)

根目录:

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