2008-08-06 171 views
56

如果我设法使用Server.MapPath来查找和验证文件的存在,我现在想直接将用户发送到该文件,那么什么是最快的转换方式那绝对路径回到一个相对的网络路径?回到网络相对路径的绝对路径

+5

这个问题是两岁,要发表评论,不存在当年的能力。 “天啊”。 – tags2k 2010-12-30 18:14:50

回答

47

也许这可能工作:

String RelativePath = AbsolutePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty); 

(我使用C#,但可以调整到VB)

(@ Tags2k:我editted上面的回答)

2

如果您使用了Server.MapPath,那么您应该已经拥有了相对的Web路径。根据MSDN documentation,此方法采用一个变量,路径,它是Web服务器的虚拟路径。所以如果你能够调用这个方法,你应该已经可以立即访问相关的web路径。

+0

这不一定是正确的 - MapPath调用可能已经由另一个方法执行,并从我的文件检查器方法传入/调用,或者(在我的情况下)由许多不同元素构建,其中之一是我的资源目录(定义为“〜/ __ Resources”)。很明显,将用户引导至此路径将导致意想不到的结果。这也是有用的知道,因为有时绝对文件路径可能已经从数据库中拉出,没有其他上下文信息。 – tags2k 2008-08-06 09:00:42

+0

[@tagsk](http://stackoverflow.com/questions/3164#3195) - 我不知道。通过定义方法,如果输入到Server.MapPath中的字符串是有效的并返回物理服务器路径,那么无论您如何生成它,它都必须是有效的虚拟路径。有关在虚拟地址开头处使用波形符号(〜)的信息,请参阅此MSDN文章[ASP.NET Web站点路径](http://msdn.microsoft.com/zh-cn/library/ms178116.aspx) :> ASP.NET包含Web应用程序>根操作符(〜),您可以在服务器中指定路径时使用 > 012ak> c – 2008-08-06 09:30:10

+2

Yaakov - 并非如此。例如,我使用的函数获取根路径并递归返回一个`IEnumerable `集合。在我的web应用程序中,我可以提供这条路径来解析我的物理路径,但是当我回到这个递归列表并想要将它们映射回我的应用程序中的相对路径时,我没有那些信息。 – 2012-06-14 18:00:16

33

Server.RelativePath(路径)不是很好吗?

好了,你只需要扩展它;-)

public static class ExtensionMethods 
{ 
    public static string RelativePath(this HttpServerUtility srv, string path, HttpRequest context) 
    { 
     return path.Replace(context.ServerVariables["APPL_PHYSICAL_PATH"], "~/").Replace(@"\", "/"); 
    } 
} 

有了这个,你可以简单地调用

Server.RelativePath(path, Request); 
11

我知道这是旧的,但我需要考虑虚拟目录(每@ Costo的评论)。这似乎有所帮助:

static string RelativeFromAbsolutePath(string path) 
{ 
    if(HttpContext.Current != null) 
    { 
     var request = HttpContext.Current.Request; 
     var applicationPath = request.PhysicalApplicationPath; 
     var virtualDir = request.ApplicationPath; 
     virtualDir = virtualDir == "/" ? virtualDir : (virtualDir + "/"); 
     return path.Replace(applicationPath, virtualDir).Replace(@"\", "/"); 
    } 

    throw new InvalidOperationException("We can only map an absolute back to a relative path if an HttpContext is available."); 
} 
4

我喜欢Canoas的想法。不幸的是,我没有提供“HttpContext.Current.Request”(BundleConfig.cs)。

我改变了梅索德这样的:

public static string RelativePath(this HttpServerUtility srv, string path) 
{ 
    return path.Replace(HttpContext.Current.Server.MapPath("~/"), "~/").Replace(@"\", "/"); 
}