在我的IHttpHandler类中(对于.ashx页面),我想在目录中搜索某些文件,并返回相对的URL。我可以得到文件,没问题:
string dirPath = context.Server.MapPath("~/mydirectory");
string[] files = Directory.GetFiles(dirPath, "*foo*.txt");
IEnumerable<string> relativeUrls = files.Select(f => WHAT GOES HERE? );
将文件路径转换为相对网址的最简单方法是什么?如果我在aspx页面中,我可以说this.ResolveUrl()
。我知道我可以做一些字符串解析和字符串替换来获取相对url,但是有一些内置的方法会为我处理所有这些吗?
编辑:为了澄清,如果不进行自己的字符串解析,我该如何解决这个问题:
"E:\Webs\WebApp1\WebRoot\mydirectory\foo.txt"
到此:
"/mydirectory/foo.txt"
我正在寻找一种现有的方法,如:
public string GetRelativeUrl(string filePath) { }
答案 0 :(得分:1)
我可以想象很多人都有这个问题......我的解决方案是:
public static string ResolveRelative(string url)
{
var requestUrl = context.Request.Url;
string baseUrl = string.Format("{0}://{1}{2}{3}",
requestUrl.Scheme, requestUrl.Host,
(requestUrl.IsDefaultPort ? "" : ":" + requestUrl.Port),
context.Request.ApplicationPath);
if (toresolve.StartsWith("~"))
{
return baseUrl + toresolve.Substring(1);
}
else
{
return new Uri(new Uri(baseUrl), toresolve).ToString();
}
}
<强>更新强>
或者从文件名到虚拟路径(尚未测试过;您可能需要一些类似于上面的ResoveRelative的代码......让我知道它是否有效):
public static string GetUrl(string filename)
{
if (filename.StartsWith(context.Request.PhysicalApplicationPath))
{
return context.Request.ApplicationPath +
filename.Substring(context.Request.PhysicalApplicationPath.Length);
}
else
{
throw new ArgumentException("Incorrect physical path");
}
}
答案 1 :(得分:0)
尝试System.Web.Hosting.HostingEnvironment.MapPath
方法,它是静态的,可以在Web应用程序的任何地方访问。