2008-08-06 36 views
56

Eğer Server.MapPath kullanarak bir dosyanın varlığını bulup doğrulamayı başarabilirsem ve şimdi bu dosyayı doğrudan o dosyaya göndermek istiyorsam, en hızlı dönüştürmenin yolu nedir o mutlak yolu göreceli bir web yoluna geri mi?Mutlak yol web-göreli yoluna geri dön

+5

Bu soru iki yaşında, sonra tekrar yoktu Yorum göndermek için yeteneği. "Tanrım". – tags2k

cevap

47

Belki de bu işe yarayabilecek
+0

Bu yalnızca bir istek bağlamında çalışır. – bzlm

+2

@ [GateKiller] (http://stackoverflow.com/questions/3164?sort=oldest#3218): Web sitenizde IIS Sanal Dizinlerini kullanırsanız, uygulama fiziksel yolunun farklı olabileceğinden çözümünüz başarısız olabilir. dosyanın fiziksel yolu. – Costo

2

Server.MapPath kullandıysanız, daha önce ilgili web yoluna sahip olmalısınız. MSDN documentation'a göre, bu yöntem, Web sunucusunun sanal yolu olan yolu yolunda bir değişkeni alır. Bu nedenle, yöntemi çağırabilirseniz, halihazırda ilgili web yoluna hemen erişebilmeniz gerekir.

: (Yukarıdaki cevabı editted gelmiş Tags2k @)

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

(i C# kullanıyorum ama fi adapte edilebilir):
+0

Bu zorunlu olarak doğru değildir - MapPath çağrısı başka bir yöntem tarafından gerçekleştirilmiş ve dosya denetleyici yöntemimden geçirilmiş/çağrılmış olabilir veya (benim durumumda) kaynak dizinim olan bir dizi farklı öğeden oluşturulmuş olabilir. "~/__ Kaynaklar" olarak tanımlanır. Açıkçası, kullanıcıyı bu yola yönlendirmek, beklenmedik sonuçlarla sonuçlanacaktır. Bu aynı zamanda bilmek de yararlı olacaktır çünkü bazen mutlak dosya yolu başka bir bağlamsal bilgi olmaksızın veritabanından çıkarılmış olabilir. – tags2k

+0

[@tagsk] (http://stackoverflow.com/questions/3164#3195) - Bunu bilmiyorum. Yöntemin tanımlandığı şekilde, Server.MapPath içine girdiğiniz dize geçerliyse ve fiziksel bir sunucu yolu döndürürse, bu, onu nasıl oluşturduğunuzdan bağımsız olarak geçerli bir sanal yol olmalıdır. Sanal bir adresin başlangıcında tilde (~) kullanımıyla ilgili olarak, [ASP.NET Web Sitesi Yolları] (http://msdn.microsoft.com/en-us/library/ms178116.aspx) adresindeki bu MSDN makalesine bakın. :> ASP.NET, > ağında bir yol belirtirken > kök operatörünü (~), Web sunucusunu içerir. > c –

+2

Yaakov - Not. Örneğin, kullandığım bir işlev bir kök yol alır ve yinelemeli olarak IENumerable koleksiyonunu döndürür. Web uygulamamda, göreceli yolumu fiziksel bir yola çözerek bu yolu sağlayabilirim, ancak bu özyinelemeli listeye geri döndüğümde ve uygulamasındaki göreli yollara geri haritalamak istediğimde bu bilgiye sahip değilim. –

33

Server.RelativePath (yol) ürününe sahip olmak güzel olmaz mı?

de (başına sadece basitçe bu eski olduğunu biliyorum

Server.RelativePath(path, Request); 
+3

fiziki yol için daha iyi bir yedek olacaktır ~ /. path.Replace (context.ServerVariables ("APPL_PHYSICAL_PATH"), "~ /") –

11

çağırabilir o Bununla

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

;-) uzatmak gerekir ama sanal dizinleri dikkate alınması açısından gerekli @ Costo'nun yorumu). Bu, aşağıdaki gibi görünüyor:

4

Canoas'ın fikrini beğeniyorum. Ne yazık ki "HttpContext.Current.Request" mevcut değildi (BundleConfig.cs).

böyle Methode değiştirdi:

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