2008-08-06 151 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(@"\", "/"); 
}