我看到有一些方法可以获取应用程序文件夹路径:
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)
根据情况,最好的方法是什么?
- 为什么我们有很多方法来获取应用程序的路径。我认为每种方式都有其原因。
- _6中存在错误:应读取:system.reflection.assembly.getExecutingAssembly().getName()‌&8203;codebase),system.io.path.getDirectoryName(application.executablePath)
- Hooray for_6,当我在一个Web项目中时,我不希望在我的IOC加载的库中使用server.mappath逻辑,它本质上不是特定于Web的
对于访问位置与应用程序安装目录相关的文件,AppDomain.CurrentDomain.BaseDirectory可能是最有用的。
在ASP.NET应用程序中,这将是应用程序根目录,而不是bin子文件夹——这可能是您通常想要的。在客户机应用程序中,它将是包含主可执行文件的目录。
在vsto 2005应用程序中,它是包含应用程序的vsto托管程序集的目录,而不是指向Excel可执行文件的路径。
其他目录可能会根据您的环境返回不同的目录-例如,请参见@vimvq1987的答案。
CodeBase是找到文件的地方,可以是以http://开头的URL。在这种情况下,Location可能是程序集下载缓存。不能保证为GAC中的程序集设置基本代码。
- 在Windowsxp32bit中测试时,它返回快捷方式的启动位置。
- 这也适用于Mac和Xamarin。
- +1@joe和vsto文档级加载项请参见
- 请注意,这将返回一个末尾带有反斜杠的路径。这导致我在格式化将结果作为进程参数传递的字符串时出现问题。
- @Avenmore—如果要格式化字符串以构建路径,请考虑使用Path.Combine。这将为您处理后面的反斜杠。
- @乔:当使用"args=string.format("-p"0"-sfalse-ltrue",appdomain.currentdomain.basedirectory);"-结果是一个未转义的引号时,它只是一个gotcha。已使用path.getdirectoryname(appdomain.currentdomain.basedirectory)对其进行修剪。
- 仅指出ASP.NET bin文件夹的解决方案是:System.IO.Path.GetDirectoryName(System.Reflection.Assembly.G‌&误8203;eteExecutingAssembly(‌&误8203;).getName().codeBase‌&误8203;)但是,它将以"文件:"作为前缀(可以用[.replace("文件:",")]修复)。
- 这将在vs 2017中为我返回bin/debug文件夹,而不是根目录。
- @smovebb-项目类型是什么?bin\debug是包含可执行文件的文件夹。
Application.StartupPath和7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)只适用于Windows窗体应用程序
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(如EDOCX1)(13))以调试模式运行的Web应用程序获取进程从-so激发的位置。
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
会得到运行代码的.dll的位置,对于可能是"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"的web应用程序。
例如,控制台应用程序点2-6将是.exe文件所在的目录。
希望这能节省你一些时间。
- 当然,想要"当前文件夹"只与非Web应用相关…
- 这就是答案。
注意,并非所有这些方法都会返回相同的值。在某些情况下,它们可以返回相同的值,但要小心,它们的用途不同:
返回StartupPath参数(可在运行应用程序时设置)
1
| System.IO.Directory.GetCurrentDirectory() |
返回当前目录,该目录可能是应用程序所在的文件夹,也可能不是。同样适用于Environment.CurrentDirectory。如果在一个dll文件中使用它,它将返回进程运行的路径(在ASP.NET中尤其如此)。
- 请不要使用GetCurrentDirectory(),因为喜欢从不同的路径运行东西!:(
对于Web应用程序,要获取当前Web应用程序根目录,通常按网页调用当前传入请求:
1 2 3
| HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; |
以上代码说明
我成功地使用了这个
1
| System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) |
它甚至在LinqPad内部也能工作。
- 这缺少getcurrentprocess的左括号。btw在Visual Studio中调试时,它在.NET核心项目中的计算结果为C:Program FilesDotnet,因为Dotnet.exe就位于该项目中。
- 固定的。谢谢您。。
我在会话中从实际登录的用户(在任务管理器会话1中不是0)通过win32 api从Windows服务启动了一个进程。在这个过程中,我们可以知道,哪个变量是最好的。
对于上述问题中的所有7个案例,结果如下:
1 2 3 4 5 6 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
| string rootPath = Path.GetPathRoot(Application.StartupPath) |
根据我的经验,最好的方法是把这些结合起来。
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase会给你垃圾箱文件夹
Directory.GetCurrentDirectory()在.NET核心而不是.NET上运行良好,并将为您提供项目的根目录
System.AppContext.BaseDirectory和AppDomain.CurrentDomain.BaseDirectory。在.NET中工作正常,但在.NET核心中不工作,它将为您提供项目的根目录
在一个应该以.NET和.NET核心为目标的类库中,我检查哪个框架是该库的宿主,并选择其中一个框架。
这一个"system.io.path.getdirectory(application.executablepath)"更改为System.IO.Path.GetDirectoryName(application.executablePath)
根目录:
1 2
| DriveInfo cDrive = new DriveInfo (System.Environment.CurrentDirectory);
var driverPath = cDrive .RootDirectory; |
- 这似乎得到了当前的工作目录,虽然这有时可能很有用,但肯定不能保证它是exe路径。