C#获取Web和非Web程序的目录
几种方法如下:
非Web程序
1.AppDomain.CurrentDomain.BaseDirectory
2.Environment.CurrentDirectory
3.HttpRuntime.BinDirectory
The path to the current application's/bin directory.
Web程序
HttpCurrent.Context.Server.Mappath();
---------------------------------------------------------------
HttpContext.Current
返回当前请求的 HttpContext 对象。如此我们就可以直接访问Request、Response、Session、Application等对象,和Page中访问等同。
我们无需再将Page用参数的方式传递到我们的类库对象中。
HttpContext.Current.Session["name"] = "猪八戒";
string name = HttpContext.Current.Request.Param["name"];
HttpContext.Current.Response.Write("猪八戒好吃懒做!");
HttpRuntime
为当前应用程序提供一组 ASP.NET 运行时服务。我们可以通过这个类获得当前ASP.NET工程的一些信息。
HttpRuntime.AppDomainAppVirtualPath : 项目虚拟路径
HttpRuntime.AppDomainAppPath : 项目物理路径
HttpRuntime.BinDirectory : BIN目录物理路径
HttpRuntime.ClrInstallDirectory : CLR安装路径(可以用来获取CLR版本号)
Response.Write(string.Format("AppDomainAppId: {0}<br>", HttpRuntime.AppDomainAppId));
Response.Write(string.Format("AppDomainAppPath: {0}<br>", HttpRuntime.AppDomainAppPath));
Response.Write(string.Format("AppDomainAppVirtualPath: {0}<br>", HttpRuntime.AppDomainAppVirtualPath));
Response.Write(string.Format("AppDomainId: {0}<br>", HttpRuntime.AppDomainId));
Response.Write(string.Format("AspInstallDirectory: {0}<br>", HttpRuntime.AspInstallDirectory));
Response.Write(string.Format("BinDirectory: {0}<br>", HttpRuntime.BinDirectory));
Response.Write(string.Format("ClrInstallDirectory: {0}<br>", HttpRuntime.ClrInstallDirectory));
Response.Write(string.Format("CodegenDir: {0}<br>", HttpRuntime.CodegenDir));
Response.Write(string.Format("IsOnUNCShare: {0}<br>", HttpRuntime.IsOnUNCShare.ToString()));
Response.Write(string.Format("MachineConfigurationDirectory: {0}<br>", HttpRuntime.MachineConfigurationDirectory));
输出:
AppDomainAppId: /LM/W3SVC/1/Root/Learn.Test.Web
AppDomainAppPath: D:SystemMy DocumentsVisual Studio ProjectsLearn.TestLearn.Test.Web
AppDomainAppVirtualPath: /Learn.Test.Web
AppDomainId: /LM/W3SVC/1/Root/Learn.Test.Web-9-127652564154400560
AspInstallDirectory: C:WINDOWSMicrosoft.NETFrameworkv1.1.4322
BinDirectory: D:SystemMy DocumentsVisual Studio ProjectsLearn.TestLearn.Test.Webin
ClrInstallDirectory: c:windowsmicrosoft.netframeworkv1.1.4322
CodegenDir: C:WINDOWSMicrosoft.NETFrameworkv1.1.4322Temporary ASP.NET Fileslearn.test.web416801327c880883
IsOnUNCShare: False
MachineConfigurationDirectory: c:windowsmicrosoft.netframeworkv1.1.4322Config
HostingEnvironment
string siteName = HostingEnvironment.SiteName;
string appPath = HostingEnvironment.ApplicationVirtualPath;
string phyPath = HostingEnvironment.ApplicationPhysicalPath;
string adminPath = HostingEnvironment.MapPath("~/Admin");
ApplicationManager.GetApplicationManager().ShutdownApplication(HostingEnvironment.ApplicationID);
灵活运用技巧:
当使用非WEB程序或使用异步调用时,想要取得根目录下的某目录可以使用如下代码:
HttpRuntime.BinDirectory + "../目录名";
获取网站根目录的方法有几种如:
Server.MapPath(Request.ServerVariables["PATH_INFO"])
Server.MapPath("/")
Server.MapPath("")
Server.MapPath(".")
Server.MapPath("../")
Server.MapPath("..")
Page.Request.ApplicationPath
运行结果:
C:InetpubwwwrootEnglishClubmanageWebForm1.aspx
C:Inetpubwwwroot
C:InetpubwwwrootEnglishClubmanage
C:InetpubwwwrootEnglishClubmanage
C:InetpubwwwrootEnglishClub
C:InetpubwwwrootEnglishClub
以上的方法可以在.aspx中访问,但是如果你在。cs文件就不能用。
HttpContext.Current.Server.MapPath();
System.Web.HttpContext.Current.Request.PhysicalApplicationPath
在.cs文件中可以用。
但是HttpContext.Current.Server.MapPath();这个获取的是文件的路径而不是根目录。
只有System.Web.HttpContext.Current.Request.PhysicalApplicationPath 这个才是获取的根目录,在写获取数据库路径是应该用这个,其他的都有问题。
测试过,在有些web项目的cs文件中可以这样用。但是最好是用System.Web.HttpContext.Current.Server.MapPath("/SystemManage/Hotel/LocList.xml");
在类库项目中,这个通常是不能用的,这个时候需要引用程序集,引用命名空间System.Web;才行。
System.Environment.CurrentDirectory + @"IPMS.WebaboutMe.txt"
多线程中的System.Web.HttpContext.Current.Server.MapPath("/")
多线程中Server.MapPath会失效。。。
网上找到几种解决方法,现在整理如下:
第一种:
System.Web.HttpContext.Current.Server.MapPath("/") 这个常用来表示网站的根目录,但是在多线程中,会发生未将对象引用设置到对象的实例。 所以不要分布在不同的类中,尽量在一个全局位置,然后其它类共用这个,毕竟网站的目录是不会改变的,可以用一个静态变量表示。
该方法:不太好;
第二种:
如果需要是WEB应用的目录下就很好办啊。假设web根目录为:c:www,而DB放在www目录下的话则可以这样。 System.AppDomain.CurrentDomain.BaseDirectory.ToString() + ConfigurationManager.AppSettings["dbPath"]就可以了
我找到办法了,就是上面的
这个是一种方法,就是将路径下载配置文件中从配置文件读取,感觉还行。
第三种:
在多线程里面使用HttpContext.Current,HttpContext.Current是得到null的. 20150703 解释下为什么当前请求上下文会为null,因为多线程情况下,当前线程可能并非http请求处理线程,根本没发生请求,所以无法获取到HttpContext就是null.
这么用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static string MapPath( string strPath)
{
if (HttpContext.Current != null )
{
return HttpContext.Current.Server.MapPath(strPath); //有http请求
}
else //非web程序引用
{
strPath = strPath.Replace( "/" , "\" );
if (strPath.StartsWith( "\" ))
{
//strPath = strPath.Substring(strPath.IndexOf('\', 1)).TrimStart('\'); strPath = strPath.TrimStart('\');
}
return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
}
}
|
多线程中的System.Web.HttpContext.Current.Server.MapPath("/")
多线程中Server.MapPath会失效。。。
网上找到几种解决方法,现在整理如下:
第一种:
System.Web.HttpContext.Current.Server.MapPath("/") 这个常用来表示网站的根目录,但是在多线程中,会发生未将对象引用设置到对象的实例。 所以不要分布在不同的类中,尽量在一个全局位置,然后其它类共用这个,毕竟网站的目录是不会改变的,可以用一个静态变量表示。
该方法:不太好;
第二种:
如果需要是WEB应用的目录下就很好办啊。假设web根目录为:c:www,而DB放在www目录下的话则可以这样。 System.AppDomain.CurrentDomain.BaseDirectory.ToString() + ConfigurationManager.AppSettings["dbPath"]就可以了
我找到办法了,就是上面的
这个是一种方法,就是将路径下载配置文件中从配置文件读取,感觉还行。
第三种:
在多线程里面使用HttpContext.Current,HttpContext.Current是得到null的. 20150703 解释下为什么当前请求上下文会为null,因为多线程情况下,当前线程可能并非http请求处理线程,根本没发生请求,所以无法获取到HttpContext就是null.
这么用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static string MapPath( string strPath)
{
if (HttpContext.Current != null )
{
return HttpContext.Current.Server.MapPath(strPath); //有http请求
}
else //非web程序引用
{
strPath = strPath.Replace( "/" , "\" );
if (strPath.StartsWith( "\" ))
{
//strPath = strPath.Substring(strPath.IndexOf('\', 1)).TrimStart('\'); strPath = strPath.TrimStart('\');
}
return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath);
}
}
|