我看到有一些方法可以获取应用程序文件夹路径:
-
Application.StartupPath
-
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
-
AppDomain.CurrentDomain.BaseDirectory
-
System.IO.Directory.GetCurrentDirectory()
-
Environment.CurrentDirectory
-
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
-
System.IO.Path.GetDirectory(Application.ExecutablePath)
根据情况,最佳方法是什么?
#1楼
对于Web应用程序,要获取当前Web应用程序的根目录,通常通过网页调用当前传入的请求:
HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
#2楼
Application.StartupPath
和System.IO.Path.GetDirectoryName(Application.ExecutablePath)
-仅适用于Windows Forms应用程序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"
,即您正在运行的页面所在的位置。Web应用程序的
AppDomain.CurrentDomain.BaseDirectory
可能有用,并且会返回诸如"C:\\\\hg\\\\Services\\\\Services\\\\Services.Website\\\\"
,这是基本目录,非常有用。System.IO.Directory.GetCurrentDirectory()
和5.Environment.CurrentDirectory
将为您提供触发该过程的位置的信息-因此,对于从Visual Studio以调试模式运行的Web应用程序,例如"C:\\\\Program Files (x86)\\\\IIS Express"
-
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)
#5楼
这一个“ System.IO.Path.GetDirectory(Application.ExecutablePath)”更改为System.IO.Path.GetDirectoryName(Application.ExecutablePath)
#6楼
以我的经验,最好的方法是将这些结合起来。
-
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
将给您bin文件夹 -
Directory.GetCurrentDirectory()
在.Net Core上工作正常,但在.Net上工作不正常,它将为您提供项目的根目录 -
System.AppContext.BaseDirectory
和AppDomain.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。