仮想パスから物理パスを取得する方法
ウェブアプリケーションを開発していて、サーバー上で特定のファイルにアクセスするコードを記述したい場合などには、 プログラムから特定のファイルの物理パスを取得する必要がある場合があります。
例えば、実行時に読み書きが必要な data1.xml という XML ファイルを App_Code フォルダに保存していて、それを読み書きするのに物理パスが必要な場合です。
しかしながら、サーバーに対して十分な管理権限がないときなど、 ウェブアプリケーションを実行する環境によっては物理パスが実行時まで不明であることがあります。
その場合、何らかの方法によって、サーバー上の物理パスの情報を取得する手段が必要になります。
一つの方法としては、Web.config に物理パスを書いて、設定項目としてやりくりする方法もあるでしょう。 しかしながら、構成の誤りによる不具合を自動的に減らすには、設定項目は必要でも少ないに越したことはありません。
設定を減らすという作戦を実践する場合には、なるべくコードをポータブルにしたいものです。 その時にはプログラムから自動的に物理パスを解決する手段が必要です。
HostingEnvironment.MapPath メソッドで物理パスを取得
今回は仮想パスから物理パスを取得するための MapPath メソッドの使い方を紹介します。
MapPath メソッドは System.Web.Hosting.HostingEnvironment クラスに実装されています。
MapPath メソッドは文字列で仮想パスを受け取り、その仮想パスに対応する物理パスを返します。
例えば、次のコードでは仮想パス "/" を渡しています。
var s1 = System.Web.Hosting.HostingEnvironment.MapPath("/");
この結果はこのホスティング環境のルートパスをホストしている物理パス (例えば C:\inetpub\wwwroot など) が 返ります。
アプリケーションルートからのパスを指定
ひとつのウェブサイトで、複数のウェブアプリケーションがホストされる場合は、 仮想パスとしてアプリケーションルートからの仮想パスを指定すると、よりポータブルなコードを書くことができます。
アプリケーションルートは "~/" で指定します。
例えば、C:\inetpub\wwwroot がウェブサイトのルートパスの環境で、 次の aspx コードを C:\inetpub\wwwroot\Test フォルダに配置したとします。
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html>
<html>
<head>
<title>MapPath Test</title>
<style>
body { font-family: monospace; }
.result{ font-weight:bold; }
</style>
</head>
<body>
<form id="form1" runat="server">
<%
var s1 = System.Web.Hosting.HostingEnvironment.MapPath("/");
var s2 = System.Web.Hosting.HostingEnvironment.MapPath("~/");
%>
<pre>MapPath("/") = <span class="result"><%= s1 %></span></pre>
<pre>MapPath("~/") = <span class="result"><%= s2 %></span></pre>
</form>
</body>
</html>
上のコードでは MapPath メソッドに、 "/" と "~/" を渡しています。 アプリケーションルートが C:\inetpub\wwwroot であるときには、どちらも C:\inetpub\wwwroot を返します。
これでも物理パスは取得できていますが、問題点としてはこのプログラムを配置する仮想パスをあらかじめ知っている必要があります。
そこで、プログラムを配置する場所をアプリケーションの開始点にします。
仮想ディレクトリを右クリックして、「アプリケーションへの変換」を選択します。
IIS マネージャ上で、地球アイコンとして表示されているところがウェブアプリケーションの開始点であることがわかります。
ウェブアプリケーションというのは、IIS においては「アプリケーションのランタイム環境の構成単位」であり、通常の仮想ディレクトリとは区別されます。
アイコンが黄色いフォルダ型なのは、ウェブアプリケーションではなく「仮想ディレクトリ」です。
ウェブアプリケーションを構成しておけば、仮想パスが予想できるようになる (アプリケーションの開始点を起点として仮想パスを記述できる) ので、アプリケーションのホスティング環境への依存度が低いコードになります。
もちろん、ウェブアプリケーションが作成できることは必要ですけどね。
以上、物理パスを取得するための MapPath メソッドの使い方を説明しました。