zoukankan      html  css  js  c++  java
  • ASP.NET将Web站点下的绝对路径转换为虚拟路径

    很经常使用到的一个功能,但在在网上却一直没有找到相关的解决方法,今天借着项目应用到的机会写了两个将绝对路径转换为虚拟路径封装好的方法
    将Web站点下的绝对路径转换为相对于指定页面的虚拟路径
    /// <summary>
    /// 将Web站点下的绝对路径转换为相对于指定页面的虚拟路径
    /// </summary>
    /// <param name="page">当前页面指针,一般为this</param>
    /// <param name="specifiedPath">绝对路径</param>
    /// <returns>虚拟路径, 型如: http://www.cnblogs.com/</returns>
    public static string ConvertSpecifiedPathToRelativePathForPage(Page page, string specifiedPath)
    {
        // 根目录虚拟路径
        string virtualPath = page.Request.ApplicationPath;
        // 根目录绝对路径
        string pathRooted = HostingEnvironment.MapPath(virtualPath);
        // 页面虚拟路径
        string pageVirtualPath = page.Request.Path;

        if (!Path.IsPathRooted(specifiedPath) specifiedPath.IndexOf(pathRooted) == -1)
        {
            throw new Exception(string.Format("\"{0}\"是虚拟路径而不是绝对路径!", specifiedPath));
        }

        // 转换成相对路径
        //(测试发现,pathRooted 在 VS2005 自带的服务器跟在IIS下根目录或者虚拟目录运行似乎不一样,
        // 有此地方后面会加"\", 有些则不会, 为保险起见判断一下)
        if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\\")
        {
            specifiedPath = specifiedPath.Replace(pathRooted, "/");
        }
        else
        {
            specifiedPath = specifiedPath.Replace(pathRooted, "");
        }

        string relativePath = specifiedPath.Replace("\\", "/");

        string[] pageNodes = pageVirtualPath.Split('/');

        // 减去最后一个页面和前面一个 "" 值
    int pageNodesCount = pageNodes.Length - 2;

     

        for (int i = 0; i < pageNodesCount; i++)
        {
            relativePath = "/.." + relativePath;
        }

        if (pageNodesCount > 0)
        {
            // 如果存在 ".." , 则把最前面的 "/" 去掉
            relativePath = relativePath.Substring(1, relativePath.Length - 1);
        }

        return relativePath;
    }

    第二个方法显然是从第一个方法中的前部分抽取出来的,所以懒得去添加相关注释 :P
    将Web站点下的绝对路径转换为虚拟路径
    /// <summary>
    /// 将Web站点下的绝对路径转换为虚拟路径
    /// 注:非Web站点下的则不转换
    /// </summary>
    /// <param name="page">当前页面指针,一般为this</param>
    /// <param name="specifiedPath">绝对路径</param>
    /// <returns>虚拟路径, 型如: ~/</returns>
    public static string ConvertSpecifiedPathToRelativePath(Page page, string specifiedPath)

    {
        string virtualPath = page.Request.ApplicationPath;

        string pathRooted = HostingEnvironment.MapPath(virtualPath);

        if (!Path.IsPathRooted(specifiedPath) specifiedPath.IndexOf(pathRooted) == -1)
        {
            return specifiedPath;
        }

        if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\\")
        {
            specifiedPath = specifiedPath.Replace(pathRooted, "~/");
        }
        else
        {
            specifiedPath = specifiedPath.Replace(pathRooted, "~");
    }

     

        string relativePath = specifiedPath.Replace("\\", "/");
        return relativePath;
    }

    将虚拟路径转绝对路就没什么好说的了, HttpRequest.MapPath 方法专门干这事

    转自:http://blog.sina.com.cn/s/blog_4efce4d10100clcj.html~type=v5_one&label=rela_prevarticle

  • 相关阅读:
    Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
    控制‘控制台应用程序’的关闭操作
    详解for循环(各种用法)
    敏捷软件开发
    Sql Server的一些知识点
    在SharePoint 2010 中配置Remote Blob Storage FILESTREAM Provider
    使用LotusScript操作Lotus Notes RTF域
    JOpt Simple 4.5 发布,命令行解析器
    John the Ripper 1.8.0 发布,密码破解工具
    PacketFence ZEN 4.0.1 发布,网络接入控制
  • 原文地址:https://www.cnblogs.com/bicabo/p/1438049.html
Copyright © 2011-2022 走看看