2012-06-11 16 views
8

Sanal bir direcoty'nin farklı bir ada sahip bir klasöre bağlanabileceğini biliyorsak, sanal dizinin fiziksel yolunu nasıl edinebilirim?Sanal dizin fiziksel yolu nasıl edinilir

HttpContext.Current.server.MapPath ile çalışıyorum ama dizin mevcut olmasa bile veya farklı bir adla var olsa bile, parametre yolla yolladığım fizik yol artı parametre yolunu döndürür.

Exemple:

C: \ blabla \ Siteler \ Application1 \ Imaageesss - disk üzerinde

Application1 \ Görüntüler

(ISS, benim virutal dizin içinde) Ama bir MapPath yaparsanız "/ Resimler" bana asla C: \ blabla \ Sites \ Application1 \ Imaageesss vermeyecek ancak C: \ inetpub \ wwwroot \ Images bağlı olan gerçek dizin değil.

+0

Aşağıdaki tüm cevaplar sorunu çözmemektedir. MapPath'in sanal bir IIS dizini olup olmadığını kontrol etmek için yeterince akıllı olmadığını varsayalım. Sağladığınız yolun uygulama kök yolunu ekler. Ne yazık ki, web'de yoğun bir şekilde arama yaptıktan sonra bile bunun için bir çözüm bulamadım. – needfulthing

+0

Bir yol buldum, aşağıya bakınız. – needfulthing

+0

İki farklı durumda benzer bir problem yaşadım. Server.MapPath ("/ Application1/Images/image.jpg") 'yerine' Server.MapPath ("/ Images/image.jpg") 'yerine tek bir durumda, diğeri ise yeni çıktı. benim sanal dizin ismimi başvuruma dahil etti. Bu şeylerin her birini yapana kadar OP'nin yaşadığı aynı sonucu elde ettim. Sadece ekleyeceğimi düşündüm ... – ionalchemist

cevap

9
Server.MapPath("~/Images") 

uygulamanın "~" referanslar root olarak bu konuda gitmek için doğru yoldur.

2

Bu küçük parçacığı nasıl denerseniz?

string physicalPath = HttpContext.Current.Request.MapPath(appPath); 
0

Bu sorunuza cevap olabilir: Yapacak çok iş var çünkü

http://msdn.microsoft.com/en-us/library/system.web.httprequest.physicalpath.aspx

Ancak, Şu anda, bir örnek sağlayamaz. Biraz zaman bulacağım zaman detaylı bilgi göndereceğim.

+1

Teşekkürler ama uzun zamandır test ettikten sonra hatamı buldum. Ben arıyorum sanal dizin bir uygulamada HttpContext.Current.server.MapPath ("/ Application/Images") yapmak gerekir ve juste "/ Images" değil – Vinhent

5

Bu benim için çalıştı budur:

string physicalPath =  
System.Web.Hosting.HostingEnvironment.MapPath(HttpContext.Current.Request.ApplicationPath); 
1

biraz daha araştırma sonra sanal IIS dizinin fiziksel yolunu alma yöntemini oluşturmak başardı:

public static string VirtualToPhysicalPath(string vPath) { 
    // Remove query string: 
    vPath = Regex.Replace(vPath, @"\?.+", "").ToLower(); 

    // Check if file is in standard folder: 
    var pPath = System.Web.Hosting.HostingEnvironment.MapPath("~" + vPath); 
    if (System.IO.File.Exists(pPath)) return pPath; 

    // Else check for IIS virtual directory: 
    var siteName = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); 
    var sm = new Microsoft.Web.Administration.ServerManager(); 
    var vDirs = sm.Sites[siteName].Applications[0].VirtualDirectories; 
    foreach (var vd in vDirs) { 
     if (vd.Path != "/" && vPath.Contains(vd.Path.ToLower())) pPath = vPath.Replace(vd.Path.ToLower(), vd.PhysicalPath).Replace("/", "\\"); 
    } 
    return pPath; 
} 

Uyarı: Bu çözüm yalnızca kök uygulamaya sahip olduğunu varsayar (Uygulamalar [0]).

İlgili konular