2012-06-11 6 views
8

Как мы знаем, что виртуальный диспетчер может быть связан с папкой с различным именем, как я могу получить физический путь к виртуальному каталогу?Как получить физический путь виртуального каталога

Я пытался с HttpContext.Current.server.MapPath, но он возвращает мне физический путь плюс путь, который я отправляю в параметр, даже если каталог вообще не существует или существует с другим именем.

Exemple:

C: \ блабла \ Сайты \ Application1 \ Imaageesss - На диске

Application1 \ Images (В ИСС, мой виртуальный каталог)

Но если я делаю MapPath на «/ Images» он никогда не даст мне C: \ blabla \ Sites \ Application1 \ Imaageesss, но C: \ inetpub \ wwwroot \ Изображения, к которым не привязан настоящий каталог.

+0

Все ответы ниже не решают проблему. Я предполагаю, что MapPath недостаточно умен, чтобы проверить, является ли это виртуальной директорией IIS или нет. Он просто добавляет корневой путь приложения к пути, который вы предоставляете. К сожалению, я не смог найти решение для этого даже после интенсивного поиска в Интернете. – needfulthing

+0

Найденный способ, см. Ответ ниже. – needfulthing

+0

У меня была аналогичная проблема при двух разных обстоятельствах. Я должен был вызвать 'Server.MapPath («/Application1/Images/image.jpg »)' вместо 'Server.MapPath («/Images/image.jpg »)' в одной ситуации, а другой он только что получился. неправильно ссылалось мое имя виртуального каталога в моем приложении. У меня был тот же результат, что и у ОП, пока я не сделал все это. Просто подумал, что добавлю ... – ionalchemist

ответ

9
Server.MapPath("~/Images") 

правильный путь идти о нем, как «~» ссылки на корень вашего приложения.

2

Что делать, если вы попробуете этот маленький фрагмент?

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

Это может ответить на ваш вопрос:

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

Однако, я не могу себе представить пример, потому что у меня много работы, чтобы сделать. Когда я найду какое-то время, я отправлю подробную информацию.

+1

Спасибо, но я только что нашел свою ошибку после тестирования в течение длительного времени. Виртуальный каталог, который я ищу, находится в приложении, поэтому мне нужно сделать HttpContext.Current.server.MapPath ("/ Application/Images"), а не juste "/ Images" – Vinhent

5

Это то, что работает для меня:

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

После еще некоторых исследований я смог создать метод, чтобы получить физический путь виртуального каталога IIS:

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

Оговорка: это решение предполагает, что у вас есть только корень приложения (Applications [0]).

Смежные вопросы