2012-06-11 28 views
8

仮想ディレクトリを異なる名前のフォルダにリンクすることができますので、仮想ディレクトリの物理パスを取得するにはどうすればよいですか。仮想ディレクトリの物理パスを取得する方法

私はHttpContext.Current.server.MapPathを試してきましたが、ディレクトリが存在しない場合でも、別の名前で存在する場合でも、物理パスとパラメータで送信するパスを返します。

Exemple:

C:\ blabla \サイト\アプリケーション1 \ Imaageesss - ディスク上

アプリケーション1 \画像

(ISS、私のVirutalのディレクトリで)しかし、私は上のMapPathの操作を行う場合"/ Images"は C:\ blabla \ Sites \ Application1 \ Imaageesssだが、 C:\ inetpub \ wwwroot \ Imagesにリンクされている実際のディレクトリではない。

+0

以下のすべての答えでは問題は解決しません。 MapPathが仮想IISディレクトリであるかどうかを確認するのに十分スマートではないと仮定します。これは、アプリケーションのルートパスを指定したパスに追加するだけです。残念ながら、Webを集中的に検索した後でも、この解決策を見つけることはできませんでした。 – needfulthing

+0

方法を見つけました。下記の回答を参照してください。 – needfulthing

+0

私は2つの異なる状況下で同様の問題を抱えていました。ある状況では '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] )。