2012-06-11 31 views
8

Như chúng ta biết rằng một direcoty ảo có thể được liên kết với một thư mục với một tên khác, làm thế nào tôi có thể nhận được đường dẫn vật lý của một thư mục ảo?Làm thế nào để có được đường dẫn vật lý ảo

Tôi đã thử với HttpContext.Current.server.MapPath nhưng nó trả về cho tôi đường dẫn vật lý cộng với đường dẫn tôi gửi tham số ngay cả khi thư mục không tồn tại hoặc nếu nó tồn tại với tên khác.

dụ:

C: \ blabla \ Sites \ Application1 \ Imaageesss - Mở đĩa

Application1 \ Images (Trong ISS, thư mục virutal của tôi)

Nhưng nếu tôi làm một MapPath trên "/ Hình ảnh" nó sẽ không bao giờ cho tôi C: \ blabla \ Sites \ Application1 \ Imaageesss nhưng C: \ inetpub \ wwwroot \ Hình ảnh không phải là thư mục thực được liên kết đến.

+0

Tất cả câu trả lời dưới đây không giải quyết được sự cố. Tôi cho rằng MapPath không đủ thông minh để kiểm tra xem đó có phải là thư mục IIS ảo hay không. Nó chỉ thêm đường dẫn gốc của ứng dụng vào đường dẫn bạn cung cấp. Rất tiếc, tôi không thể tìm thấy giải pháp cho điều này ngay cả sau khi tìm kiếm trên web một cách mạnh mẽ. – needfulthing

+0

Tìm cách, xem câu trả lời bên dưới. – needfulthing

+0

Tôi gặp vấn đề tương tự trong hai trường hợp khác nhau. Tôi đã phải gọi 'Server.MapPath ("/Application1/Images/image.jpg ")' thay vì 'Server.MapPath ("/Images/image.jpg ")' trong một tình huống, và cái kia nó chỉ hóa ra tôi mis-tham chiếu tên thư mục ảo của tôi trong ứng dụng của tôi. Tôi đã có cùng một kết quả mà OP đã trải qua cho đến khi tôi làm được những điều này. Chỉ cần nghĩ rằng tôi muốn thêm vào ... – ionalchemist

Trả lời

9
Server.MapPath("~/Images") 

là cách chính xác để đi về nó như là "~" tài liệu tham khảo thư mục gốc của ứng dụng của bạn.

2

Nếu bạn thử đoạn mã nhỏ này thì sao?

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

này có thể trả lời câu hỏi của bạn:

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

Tuy nhiên, tôi không thể hiện đang cung cấp một ví dụ, bởi vì tôi đã có rất nhiều việc phải làm. Khi tôi sẽ tìm một thời gian, tôi sẽ gửi thông tin chi tiết.

+1

Cảm ơn nhưng tôi chỉ tìm thấy sai lầm của tôi sau khi thử nghiệm trong thời gian dài. Thư mục ảo mà tôi đang tìm kiếm nằm trong một ứng dụng vì vậy tôi cần phải làm HttpContext.Current.server.MapPath ("/ Application/Images") và không phải là juste "/ Images" – Vinhent

5

Đây là những gì làm việc cho tôi:

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

Sau khi một số nghiên cứu nhiều hơn tôi đã có thể tạo ra một phương pháp để có được những con đường vật lý của một thư mục IIS ảo:

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

Nên biết trước: giải pháp này giả định rằng bạn chỉ có một ứng dụng gốc (Ứng dụng [0]).

Các vấn đề liên quan