2012-06-11 2 views
8

가상 디렉터리를 다른 이름으로 폴더에 연결할 수 있다는 것을 알고 있으므로 어떻게 가상 디렉터리의 실제 경로를 얻을 수 있습니까?가상 디렉터리 실제 경로를 얻는 방법

나는 HttpContext.Current.server.MapPath로 시도해 왔지만 디렉토리가 존재하지 않거나 다른 이름으로 존재하더라도 매개 변수로 전달하는 경로와 물리 경로를 반환합니다.

Exemple :

C : \ blabla \ 사이트 \ 응용 프로그램 1 \ Imaageesss - 디스크에

응용 프로그램 1 \ 이미지

(ISS 내 virutal 디렉토리에서)하지만 난에 MapPath를 할 경우 "/ Images"라고 입력하면 C : \ blabla \ Sites \ Application1 \ Imaageesss하지만 C : \ inetpub \ wwwroot \ 이미지는 실제 디렉토리가 연결되지 않습니다.

+0

아래의 모든 대답은 문제를 해결하지 못합니다. MapPath가 가상 IIS 디렉토리인지 아닌지 충분히 확인할 수는 없다고 가정합니다. 단지 당신이 제공하는 경로에 응용 프로그램 루트 경로를 추가합니다. 불행하게도 나는 집중적으로 웹을 검색 한 후에도이를위한 해결책을 찾을 수 없었다. – needfulthing

+0

방법을 찾았습니다. 아래 답변을 참조하십시오. – needfulthing

+0

두 가지 상황에서 비슷한 문제가있었습니다. 하나의 상황에서'Server.MapPath ("/ Images/image.jpg")'대신'Server.MapPath ("/ Application1/Images/image.jpg")'를 호출해야하고, 내 응용 프로그램 내 가상 디렉터리 이름을 잘못 참조했습니다. 나는 이러한 일들을 할 때까지 OP가 경험했던 것과 같은 결과를 얻었습니다. 그냥 내가 추가 할 줄 알았는데 ... – 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")가 아니라 "/ 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; 
} 

경고 :이 솔루션은 당신은 단지 루트 응용 프로그램이 있다고 가정합니다 (응용 프로그램 [0]).

관련 문제