• 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"

    HttpContext.Current.Server.MapPath("/") 未将对象设置到对象的实例异常。

    多线程中的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);
              }
          }
  • 相关阅读:
    [ARC080D] Prime Flip
    硬币游戏
    点分治
    OneInDark对众数的爱
    [CF838D] Airplane Arrangements
    网络流总结(转载)
    二分图最大权完美匹配(KM)
    网络流
    FWT
    FFT & NTT
  • 原文地址:https://www.cnblogs.com/Alex80/p/9160220.html
Copyright © 2020-2023  润新知