誰もがServer.MapPath(".")
、Server.MapPath("~")
、Server.MapPath(@"\")
、Server.MapPath("/")
の違いを説明できますか?
Server.MapPath は、 を物理ディレクトリにマッピングするための相対パスまたは仮想パス を指定します。
Server.MapPath(".")
1 実行中のファイルの現在の物理ディレクトリ(aspxなど)を返します。Server.MapPath("..")
は親ディレクトリを返しますServer.MapPath("~")
はアプリケーションのルートへの物理パスを返しますServer.MapPath("/")
は、ドメイン名のルートへの物理パスを返します(必ずしもアプリケーションのルートと同じではありません)。例:
あなたがウェブサイトのアプリケーション(http://www.example.com/
)を指さしたとしましょう。
C:\Inetpub\wwwroot
ショップアプリケーション(IISの仮想ディレクトリとしてのサブWeb。アプリケーションとしてマークされています)をインストールします。
D:\WebApps\shop
たとえば、次の要求でServer.MapPath()
を呼び出すとします。
http://www.example.com/shop/products/GetProduct.aspx?id=2342
その後:
Server.MapPath(".")
1 D:\WebApps\shop\products
を返しますServer.MapPath("..")
はD:\WebApps\shop
を返しますServer.MapPath("~")
はD:\WebApps\shop
を返しますServer.MapPath("/")
はC:\Inetpub\wwwroot
を返しますServer.MapPath("/shop")
はD:\WebApps\shop
を返しますPathがスラッシュ(/
)またはバックスラッシュ(\
)のいずれかで始まっている場合、MapPath()
は、Pathがフル仮想パスであるかのようにパスを返します。
Pathがスラッシュで始まっていない場合、MapPath()
は処理中のリクエストのディレクトリからの相対パスを返します。
注:C#では、@
は逐語的なリテラル文字列演算子で、文字列は「そのまま」使用し、エスケープシーケンスでは処理しないでください。
脚注
Server.MapPath(null)
とServer.MapPath("")
は この効果も生み出します 。@ splattneの答えを少しだけ拡張してみましょう。
MapPath(string virtualPath)
は以下を呼び出します。
public string MapPath(string virtualPath)
{
return this.MapPath(VirtualPath.CreateAllowNull(virtualPath));
}
MapPath(VirtualPath virtualPath)
は、次のものを含むMapPath(VirtualPath virtualPath, VirtualPath baseVirtualDir, bool allowCrossAppMapping)
を呼び出します。
//...
if (virtualPath == null)
{
virtualPath = VirtualPath.Create(".");
}
//...
したがって、MapPath(null)
またはMapPath("")
を呼び出すと、事実上MapPath(".")
が呼び出されます
1)Server.MapPath(".")
- 実行中のファイルの現在の物理ディレクトリ(例:aspx
)を返します。
例D:\WebApplications\Collage\Departments
とします。
2)Server.MapPath("..")
- "親ディレクトリ"を返します
例D:\WebApplications\Collage
3)Server.MapPath("~")
- "アプリケーションのルートへの物理パス"を返します
例D:\WebApplications\Collage
4)Server.MapPath("/")
- ドメイン名のルートへの物理パスを返します
例C:\Inetpub\wwwroot