2009-07-27 7 views
118

Tôi đang cố gắng lấy đường dẫn tuyệt đối của các tệp nhất định trong lớp C#. Server.MapPath hoạt động tuyệt vời tất nhiên cho ASPX và các trang mã-đằng sau của chúng, nhưng điều đó không tồn tại trong một 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?Sử dụng Server.MapPath trong các lớp C# bên ngoài trong ASP.NET

System.Web đã được nhập.

Trả lời

266

Lớp ServerUtility có sẵn dưới dạng phiên bản trong HttpContext của bạn. Nếu bạn đang ở trong một môi trường mà bạn biết điều đó sẽ được thực hiện bên trong các đường ống dẫn ASP.Net, bạn có thể sử dụng

HttpContext.Current.Server.MapPath() 

Bạn sẽ phải nhập khẩu System.Web mặc dù.

+1

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

+6

Điều gì sẽ xảy ra nếu nó không được thực thi trong đường ống đó? – zaitsman

+0

Nếu bạn không thực hiện bên trong ASP.Net thì không chắc 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 ngữ cảnh thực thi nào (router?) Cung cấp.Nếu quá trình của bạn có thông tin chi tiết về các khái niệm cơ bản về định tuyến đường dẫn của bạn, bạn có thể xem các phương thức System.IO.Path. – womp

8

Bạn không thể chỉ thêm một tham chiếu đến System.Web và sau đó bạn có thể sử dụng Server.MapPath?

Edit: Ngày nay tôi khuyên bạn nên sử dụng HostingEnvironment.MapPath Method:

Đó là một phương pháp tĩnh trong System.Web lắp ráp mà Maps một con đường ảo để một con đường vật lý trên máy chủ. Nó không yêu cầu tham chiếu đến HttpContext.

+0

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

+0

Chắc chắn bạn có thể thêm tham chiếu vào 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. –

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

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

+0

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

+1

Ông nói "một số tập tin" ông 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 con đường đó có thể hữu ích. Tất nhiên nếu anh ta thực sự tuyên bố anh ta vẫn còn trong một HttpContext thì tôi sẽ không làm phiền việc trả lời. –

+0

David McEwing, những gì bạn đề xuất sẽ không hoạt động vì IIS không tải các hội đồng từ vị trí mà bạn cài đặt chúng vào, trong trang web. Chúng được sao chép và tải từ một vị trí cache tạm thời asp.net, do đó, thực hiện GetAssembly hoặc GetExecutingAssembly sẽ trỏ bạn đến vị trí của assembly, nhưng nó sẽ không liên quan gì đến vị trí của trang web mà MapPath trỏ tới. – zumalifeguard

2
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 là đơn giản và với một phương pháp u có thể sử dụng nhiều con đường cho mỗi cuộc gọi :)

3

Tôi cũng sử dụng điều này:

System.Web.HTTPContext.Current.Server.MapPath 
30

bạn cũng có thể sử 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"); 

là không thể tiếp cận

3

một này đã giúp cho 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); 
+0

Chào mừng bạn đến với stackoverflow. Lời giải thích nhỏ hơn sẽ giúp các lập trình viên đồng nghiệp hiểu tại sao giải pháp lại hiệu quả. – Daenarys

1

dù bạn đang chạy trong bối cảnh của ASP .NET hay không, bạn sẽ có thể sử dụng HostingEnvironment.ApplicationP hysicalPath