Lấy thư mục hiện tại trong ứng dụng web .NET


105

Vì vậy, tôi có một dự án web và tôi đang cố lấy thư mục gốc của trang web bằng phương thức c # Directory.GetCurrentDirectory(). Tôi không muốn sử dụng đường dẫn tĩnh vì vị trí tệp sẽ thay đổi trong tương lai. Phương thức này đang chạy trong tệp imageProcess.aspx.cs của tôi, nhưng nơi tôi nghĩ rằng nó sẽ trả về:

C:\Users\tcbl\documents\visual studio 2010\Projects\ModelMonitoring\ModelMonitoring\imageProcess.aspx.cs

Thay vào đó tôi nhận được:

C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\

Bất cứ ai có thể giải thích tại sao điều này đang xảy ra và một giải pháp khả thi có thể là gì? Cảm ơn rất nhiều.


Bài liên quan ở đây nói về đường dẫn thực thi ứng dụng .Net nói chung.
RBT

Câu trả lời:


210

Thư mục hiện tại là một tính năng cấp hệ thống; nó trả về thư mục mà máy chủ đã được khởi chạy. Nó không liên quan gì đến trang web.

Bạn muốn HttpRuntime.AppDomainAppPath.

Nếu bạn đang ở trong một yêu cầu HTTP, bạn cũng có thể gọi Server.MapPath("~/Whatever").


2
Cảm ơn. Tôi thực sự đang tìm kiếm HttpRuntime.BinDirectory, nhưng điều đó rất dễ xác định trong trình gỡ lỗi, sau khi tôi thử những gì bạn đã đề cập trong câu trả lời của mình.
Kent Weigel

Nếu tôi sử dụng `Server.MapPath ( "~ Dù") và các trang web IIS được lưu trữ trong myserver . Tôi nhận được một C: \\ somefolder \ Dù, thay vì thư mục myserver / Dù .
Si8

@ Si8: Vâng; đó là những gì Server.MapPathhiện. Bạn muốn stackoverflow.com/q/5823847/34397
SLaks

2
Trong trường hợp bạn không quen với các hội đồng .NET (hoặc đang ở trong Cửa sổ ngay lập tức), các lệnh đầy đủ là System.Web.HttpRuntime.AppDomainAppPathSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern

2
@testpattern HttpContextđược System.Web.HttpContext.Current.Server.MapPath("~"), không cóHttpRuntime
chengzi

112

Sử dụng mã này:

 HttpContext.Current.Server.MapPath("~")

Tham khảo chi tiết:

Server.MapPath chỉ định đường dẫn tương đối hoặc đường dẫn ảo để ánh xạ tới một thư mục vật lý.

  • Server.MapPath(".") trả về thư mục vật lý hiện tại của tệp (ví dụ: aspx) đang được thực thi
  • Server.MapPath("..") trả về thư mục mẹ
  • Server.MapPath("~") trả về đường dẫn vật lý đến thư mục gốc của ứng dụng
  • Server.MapPath("/") trả về đường dẫn vật lý đến gốc của tên miền (không nhất thiết phải giống với đường dẫn gốc của ứng dụng)

Một ví dụ:

Giả sử bạn đã trỏ một ứng dụng trang web ( http://www.example.com/ ) tới

C:\Inetpub\wwwroot

và cài đặt ứng dụng cửa hàng của bạn (web phụ dưới dạng thư mục ảo trong IIS, được đánh dấu là ứng dụng) trong

D:\WebApps\shop

Ví dụ: nếu bạn gọi Server.MapPaththeo yêu cầu sau:

http://www.example.com/shop/products/GetProduct.aspx?id=2342

sau đó:

Server.MapPath(".") returns D:\WebApps\shop\products
Server.MapPath("..") returns D:\WebApps\shop
Server.MapPath("~") returns D:\WebApps\shop
Server.MapPath("/") returns C:\Inetpub\wwwroot
Server.MapPath("/shop") returns D:\WebApps\shop

Nếu Đường dẫn bắt đầu bằng dấu gạch chéo về phía trước (/) hoặc dấu gạch chéo ngược (), MapPathphương thức trả về một đường dẫn như thể Đường dẫn là một đường dẫn ảo, đầy đủ.

Nếu Đường dẫn không bắt đầu bằng dấu gạch chéo, MapPathphương thức trả về một đường dẫn liên quan đến thư mục của yêu cầu đang được xử lý.

Lưu ý: trong C #, @ là toán tử chuỗi theo nguyên văn nghĩa là chuỗi phải được sử dụng "nguyên trạng" và không được xử lý cho các chuỗi thoát.

Chú thích

Server.MapPath(null)Server.MapPath("")cũng sẽ tạo ra hiệu ứng này.


17
Bản sao hoàn hảo của stackoverflow.com/questions/275781/…
GGO

3
@GGO Liên kết tốt! Sau khi liên kết, tôi đã kết thúc làm System.Web.Hosting.HostingEnvironment.MapPath("~")thay vào đó, mà hoạt động tuyệt vời, không có sự phụ thuộc vàoSystem.Web.HttpContext.Current
Max Barraclough
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.