Sử dụng Server.MapPath trong các lớp C # bên ngoài trong ASP.NET


132

Tôi đang cố gắng để có được đường dẫn tuyệt đối của một số tệp nhất định trong lớp C #. Server.MapPathTất nhiên là hoạt động tốt đối với ASPX và các trang phía sau mã của chúng, nhưng điều đó không tồn tại trong tệp lớp khác. Tôi đã thử HostingEnvironment.MapPath(), nhưng điều đó phàn nàn rằng đường dẫn ảo tương đối không được phép. Có suy nghĩ gì không?

System.Web đã được nhập khẩu.

Câu trả lời:


302

Các ServerUtilitylớp có sẵn như là một ví dụ trong của bạn HttpContext. Nếu bạn đang ở trong một môi trường mà bạn biết nó sẽ được thực thi bên trong đường dẫn ASP.Net, bạn có thể sử dụng

HttpContext.Current.Server.MapPath()

Bạn sẽ phải nhập System.Webmặc dù.


1
Mặc dù bài đăng này đã hơn 2 năm nhưng bạn đã giúp tôi rất nhiều. Cảm ơn.
iarwain01

6
Điều gì nếu nó không được thực hiện trong đường ống đó?
zaitsman

Nếu bạn không thực thi bên trong ASP.Net thì không chắc là HTTPContext của bạn đang được thiết lập, trừ khi bạn đã viết đường dẫn của riêng mình :) Bạn sẽ phải dựa vào bất kỳ phương thức nào mà bối cảnh thực thi (bộ định tuyến?) Cung cấp. Nếu quy trình của bạn có cái nhìn sâu sắc về những điều cơ bản của định tuyến đường dẫn, bạn có thể xem các phương thức System.IO.Path.
vào

Điều này được biên dịch nhưng bối cảnh là null bên ngoài bộ điều khiển, vì vậy lỗi mã của tôi. Tôi nghĩ womp đang nói điều tương tự ở đó. Nếu đó là trường hợp bạn có thể truy cập MapPath bên ngoài các bộ định tuyến?
edencorbin

34

bạn cũng có thể dùng:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt")

nếu

var path = Server.MapPath("~/App_Data");
var fullpath = Path.Combine(path , "myfile.txt");

không thể truy cập


8

Bạn không thể chỉ cần thêm một tài liệu tham khảo System.Webvà sau đó bạn có thể sử dụng Server.MapPath?

Chỉnh sửa: Ngày nay tôi khuyên bạn nên sử dụng HostingEnvironment.MapPathPhương pháp :

Đây là một phương thức tĩnh trong System.Weblắp ráp Bản đồ một đường dẫn ảo đến một đường dẫn vật lý trên máy chủ. Nó không yêu cầu một tài liệu tham khảo HttpContext.


Không phải trong các lớp học bên ngoài.
funwhilelost

Chắc chắn bạn có thể thêm tham chiếu đến một lớp bên ngoài; nhưng rõ ràng bạn cần sử dụng nó trong ngữ cảnh của một yêu cầu máy chủ để HTTPContext không phải là null.
Dan Diplo

4
System.Reflection.Assembly.GetAssembly(type).Location

NẾU tập tin bạn đang cố lấy là vị trí lắp ráp cho một loại. Nhưng nếu các tệp có liên quan đến vị trí lắp ráp thì bạn có thể sử dụng System.IOtệp này với không gian tên để có được đường dẫn chính xác của tệp.


-1: Điều gì khiến bạn tin rằng anh ấy muốn vị trí của một hội đồng?
John Saunders

1
Anh ấy nói "một số tập tin" anh ấy đã không chỉ định vị trí hoặc bản chất của các tập tin, do đó biết vị trí lắp ráp và có thể làm việc liên quan đến đường dẫn đó có thể hữu ích. Tất nhiên, nếu anh ấy thực sự tuyên bố rằng anh ấy vẫn đang ở trong một HTTPContext thì tôi sẽ không buồn trả lời.
David McEwing

David McEwing, những gì bạn đề xuất sẽ không hoạt động vì IIS không tải các cụm từ vị trí bạn cài đặt chúng trong trang web. Chúng được sao chép và tải từ một vị trí bộ đệm tạm thời asp.net, do đó, việc thực hiện GetAssugging hoặc GetExecutingAssugging sẽ chỉ cho bạn đến vị trí lắp ráp, nhưng nó sẽ không liên quan gì đến vị trí của trang web mà MapPath trỏ tới.
bảo vệ zumalififard


3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

Bây giờ khi bạn gọi phương thức từ codebehind

ví dụ :

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}

theo cách này, mã của bạn đơn giản và với một phương thức, bạn có thể sử dụng nhiều đường dẫn cho mỗi cuộc gọi :)


3

Cái này giúp tôi

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

Chào mừng đến với stackoverflow. Giải thích thêm một chút sẽ giúp các lập trình viên đồng nghiệp hiểu lý do tại sao giải pháp được thực hiện.
NJInamdar

1

Cho dù bạn có đang chạy trong bối cảnh của ASP.NET hay không, bạn sẽ có thể sử dụng HostingEn Môi trường.ApplicationPhysicalPath


0

Server.mappath ("") sẽ hoạt động trên trang aspx, nếu bạn muốn có được đường dẫn tuyệt đối từ một tệp lớp, bạn phải sử dụng điều này-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
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.