| 订阅 | 在线投稿
分享
 
 
 

ASP.NET将Web站点下的绝对路径转换为虚拟路径

2006-11-24 06:26:17 编辑來源:互联网 国际版 评论
 
 
  很经常使用到的一个功能,但在在网上却一直没有找到相关的解决方法,今天借着项目应用到的机会写了两个将绝对路径转换为虚拟路径封装好的方法

  将Web站点下的绝对路径转换为相对于指定页面的虚拟路径

  /**//// <summary>

  /// 将Web站点下的绝对路径转换为相对于指定页面的虚拟路径

  /// </summary>

  /// <param name="page">当前页面指针,一般为this</param>

  /// <param name="specifiedPath">绝对路径</param>

  /// <returns>虚拟路径, 型如: ../../</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 方法专门干这事
 
 
很经常使用到的一个功能,但在在网上却一直没有找到相关的解决方法,今天借着项目应用到的机会写了两个将绝对路径转换为虚拟路径封装好的方法 将Web站点下的绝对路径转换为相对于指定页面的虚拟路径 /**//// <summary> /// 将Web站点下的绝对路径转换为相对于指定页面的虚拟路径 /// </summary> /// <param name="page">当前页面指针,一般为this</param> /// <param name="specifiedPath">绝对路径</param> /// <returns>虚拟路径, 型如: ../../</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 方法专门干这事
󰈣󰈤
 
 
>>返回首页<<
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 
 热帖排行
 
 
王朝网络微信公众号
微信扫码关注本站公众号wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
©2005- 王朝网络 版权所有