2012-06-11 19 views
8

Come sappiamo che un direcoty virtuale può essere collegato ad una cartella con un nome differente, come posso ottenere il percorso fisico di una directory virtuale?Come ottenere directory virtuale percorso fisico

Ho provato con HttpContext.Current.server.MapPath ma mi restituisce il percorso fisico più il percorso che invio nel parametro anche se la directory non esiste nemmeno o se esiste con un nome diverso.

Esempio:

C: \ blabla \ Siti \ Application1 \ Imaageesss - Sul disco

Application1 \ Immagini (Nella ISS, la mia directory virtuale)

Ma se faccio un MapPath su "/ Immagini" non mi darà mai C: \ blabla \ Sites \ Application1 \ Imaageesss ma C: \ inetpub \ wwwroot \ Immagini che non è la vera directory collegata a.

+0

Tutte le risposte di seguito non risolvono il problema. Presumo che MapPath non sia abbastanza intelligente da verificare se si tratta di una directory IIS virtuale o meno. Aggiunge solo il percorso root dell'applicazione al percorso che fornisci. Sfortunatamente non sono riuscito a trovare una soluzione anche dopo aver effettuato ricerche approfondite sul web. – needfulthing

+0

Trovato un modo, vedere la risposta qui sotto. – needfulthing

+0

Ho avuto un problema simile in due diverse circostanze. Ho dovuto chiamare 'Server.MapPath ("/Application1/Images/image.jpg ")' invece di 'Server.MapPath ("/Images/image.jpg ")' in una situazione, e l'altro è appena uscito mis-referenced il mio nome di directory virtuale all'interno della mia applicazione. Ho avuto lo stesso risultato che l'OP stava sperimentando fino a quando ho fatto ognuna di queste cose. Ho solo pensato di aggiungere ... – ionalchemist

risposta

9
Server.MapPath("~/Images") 

è il modo corretto di andare su di esso come "~" i riferimenti alla radice della vostra applicazione.

2

E se provassi questo piccolo frammento?

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

Questo potrebbe rispondere alla tua domanda:

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

Tuttavia, attualmente non può fornire un esempio, perché ho avuto un sacco di lavoro da fare. Quando troverò un po 'di tempo manderò informazioni dettagliate.

+1

Grazie ma ho appena trovato il mio errore dopo aver provato per molto tempo. La directory virtuale che sto cercando è in un'applicazione, quindi ho bisogno di fare HttpContext.Current.server.MapPath ("/ Application/Images") e non juste "/ Images" – Vinhent

5

Questo è ciò che ha funzionato per me:

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

Dopo un po 'di ricerche ho stato in grado di creare un metodo per ottenere il percorso fisico di una directory IIS virtuale:

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; 
} 

Caveat: questa soluzione si presuppone che solo un'applicazione root (Applicazioni [0]).

Problemi correlati