Can anyone explain the difference between Server.MapPath("."), Server.MapPath("~"), Server.MapPath(@"\") and Server.MapPath("/")?
4 Answers
Server.MapPath specifies the relative or virtual path to map to a physical directory.
Server.MapPath(".")1 returns the current physical directory of the file (e.g. aspx) being executedServer.MapPath("..")returns the parent directoryServer.MapPath("~")returns the physical path to the root of the applicationServer.MapPath("/")returns the physical path to the root of the domain name (is not necessarily the same as the root of the application)
An example:
Let's say you pointed a web site application (http://www.example.com/) to
C:\Inetpub\wwwroot
and installed your shop application (sub web as virtual directory in IIS, marked as application) in
D:\WebApps\shop
For example, if you call Server.MapPath() in following request:
http://www.example.com/shop/products/GetProduct.aspx?id=2342
then:
Server.MapPath(".")1 returnsD:\WebApps\shop\productsServer.MapPath("..")returnsD:\WebApps\shopServer.MapPath("~")returnsD:\WebApps\shopServer.MapPath("/")returnsC:\Inetpub\wwwrootServer.MapPath("/shop")returnsD:\WebApps\shop
If Path starts with either a forward slash (/) or backward slash (\), the MapPath() returns a path as if Path was a full, virtual path.
If Path doesn't start with a slash, the MapPath() returns a path relative to the directory of the request being processed.
Note: in C#, @ is the verbatim literal string operator meaning that the string should be used "as is" and not be processed for escape sequences.
Footnotes
Server.MapPath(null)andServer.MapPath("")will produce this effect too.
-
45Excellent. We've been battling with Server.Bloody.MapPath. Thanks – gbn May 10 '10 at 15:16
-
27You will be better off using `HostingEnvironment.MapPath` as it doesn't require `HttpContext`: http://stackoverflow.com/q/944219/3205 – skolima Jul 25 '12 at 14:57
-
Two questions, as follows: (1.) Does the ASP Classic version of Server.MapPath work the same way as described above? AND (2.) I have an SSD drive that I installed in a server, and it's drive letter is "G:" The website is on drive letter "E:" I would like the IMAGES directory (and perhaps others) to reside on the G: drive (for speed), but Server.MapPath returns E: when used in code. It is already a virtual directory that points to the E: drive. If I point it to the G: drive, how do I inform Server.MapPath to return the proper drive letter to the IMAGES folder? – PaulScott Mar 03 '21 at 01:57
Just to expand on @splattne's answer a little:
MapPath(string virtualPath) calls the following:
public string MapPath(string virtualPath)
{
return this.MapPath(VirtualPath.CreateAllowNull(virtualPath));
}
MapPath(VirtualPath virtualPath) in turn calls MapPath(VirtualPath virtualPath, VirtualPath baseVirtualDir, bool allowCrossAppMapping) which contains the following:
//...
if (virtualPath == null)
{
virtualPath = VirtualPath.Create(".");
}
//...
So if you call MapPath(null) or MapPath(""), you are effectively calling MapPath(".")
- 27,509
- 17
- 104
- 136
1) Server.MapPath(".") -- Returns the "Current Physical Directory" of the file (e.g. aspx) being executed.
Ex. Suppose D:\WebApplications\Collage\Departments
2) Server.MapPath("..") -- Returns the "Parent Directory"
Ex. D:\WebApplications\Collage
3) Server.MapPath("~") -- Returns the "Physical Path to the Root of the Application"
Ex. D:\WebApplications\Collage
4) Server.MapPath("/") -- Returns the physical path to the root of the Domain Name
Ex. C:\Inetpub\wwwroot
- 959
- 9
- 12
Working Example, hope this helps show a way to use MapPath with more than just a "/". We are combining "/" and "~".
- string lotMapsUrl = "~/WebFS/Transport/Maps/Lots/"; --- just get the long URL into a variable
- string lotMapsDir = Server.MapPath(lotMapsUrl); --- get our full physical path to this location
- string[] files = Directory.GetFiles(lotMapsUrl); --- go grab a list of the files from the physical path.
- 99
- 1
- 6