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

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

  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)

根据情况,最佳方法是什么?


#1楼

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

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

以上代码说明


#2楼

  1. Application.StartupPathSystem.IO.Path.GetDirectoryName(Application.ExecutablePath) -仅适用于Windows Forms应用程序

  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)

对于可能是"file:\\\\C:\\\\hg\\\\Services\\\\Services\\\\Services.Website\\\\bin" Web应用程序,将为您找到运行代码的.dll所在的位置

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

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


#3楼

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

当您为案例搜索最佳变量时,可能对做同样事情的某些人有所帮助。


#4楼

我已经成功使用了这个

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

它甚至可以在linqpad内部使用。


#5楼

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


#6楼

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

  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楼

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

string rootPath = Path.GetPathRoot(Application.StartupPath)

#8楼

根目录:

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

#9楼

  • .NET Core 3.0引入了IHostEnvironment.ContentRootPath
  • .NET Core 2.1引入了IHostingEnvironment.ContentRootPath (自Core 3.0后已过时)。

我个人发现这些是我通常需要的:包含内容的位置。

我可以确认IHostEnvironment.ContentRootPath在作为单元测试运行时也返回了所需的结果。 (已使用xUnit测试,但框架应该没有关系。)


#10楼

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

Application.StartupPath

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

System.IO.Directory.GetCurrentDirectory()

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


#11楼

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

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

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

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

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

发布了0 篇原创文章 · 获赞 2 · 访问量 5908

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/104074431
今日推荐