2011-01-06 17 views
12

Tôi đang cố gắng tìm cách xác định vị trí tệp trong web.config appSettings tránh sử dụng đường dẫn được mã hóa cứng nhưng cho phép không nhận biết ' Thư viện C# để tìm tệp.Chỉ định vị trí tệp tương đối trong web.config để sử dụng theo thư viện lớp chuẩn C#

Thư viện C# sử dụng phương pháp chuẩn File.Open, File.Exists, v.v. để hoạt động trên tệp dữ liệu được lưu trữ trong cây ứng dụng web (ASP.NET MVC) của tôi, ví dụ: dưới:

\content\data\MyDataFile.txt 

Yêu cầu:

  • Tôi muốn có thể để xác định con đường của tôi như thế nào, ví dụ như:
 
     <appSettings> 
this-->  <add key="MyFileLocation" value="~\content\data\MyDataFile.txt" /> 
not -->  <add key="MyFileLocation" value="c:\inetpub\wwwroot\foo\content\data\MyDataFile.txt" /> 
     </appSettings> 
  • Tôi không muốn C# thư viện để lưu ý về ứng dụng web mà nó đang được sử dụng, vì nó được sử dụng trong các phần mềm khác và ứng dụng web không cần biết về cấu hình của C# libra ry vì vậy tôi không thực sự muốn vượt qua thông tin cấu hình giữa các lớp nếu có thể.

Bất kỳ đề xuất nào về cách tôi có thể thực hiện điều này một cách rõ ràng? Cảm ơn!

Trả lời

23

Bạn có thể sử dụng Path.Combine để kết hợp AppDomain.CurrentDomain.BaseDirectory và đường dẫn tương đối của bạn.

Điều này sẽ cung cấp cho bạn đường dẫn tương đối với thư mục gốc ASP.NET (~ /) trong ứng dụng ASP.NET hoặc đường dẫn tương đối với thư mục chứa tệp thực thi trong ứng dụng WinForms hoặc Console.

+0

Chỉ phát hiện ra điều này nhưng tôi sẽ cung cấp cho bạn các điểm! Chắc chắn làm việc trong trường hợp của tôi (và trong một ứng dụng giao diện điều khiển tôi gõ lên để kiểm tra). Bất kỳ ý tưởng nếu có bất kỳ trường hợp này sẽ thất bại? Cảm ơn. –

-1

nếu bạn làm

File.Open(@"content\data\file.txt") 

nó sẽ liên quan đến vị trí lắp ráp thực hiện.

+6

Trong trường hợp ứng dụng web thường có thể là các tệp 'c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET' gần như luôn luôn là _not_ những gì bạn muốn. –

+1

-1 - điều này là sai, nó sẽ liên quan đến thư mục làm việc hiện tại - có thể là% WINDIR% \ system32 \ inetsrv nếu chạy dưới IIS hoặc thư mục chứa máy chủ web Cassini nếu chạy trong Visual Studio. Nó thường không phải là một ý tưởng tốt để đưa ra các giả định về thư mục làm việc hiện tại. – Joe

4

Tại sao không có ứng dụng web đọc đường dẫn từ tệp cấu hình, giải quyết nó bằng cách sử dụng Server.MapPath, sau đó chuyển đường dẫn kết quả tới thư viện lớp?


Dựa trên nhận xét của bạn, tôi có đề xuất khác: không sử dụng đường dẫn tương đối.

+0

Có, tôi đã xem xét điều đó nhưng không muốn làm như vậy vì nó làm giảm sự tách biệt các mối quan tâm trong ứng dụng của tôi; nó sẽ yêu cầu ứng dụng web của tôi phải tham gia vào cấu hình của thư viện (được truy cập thông qua các giao diện, vì vậy có thể được đổi chỗ sau này). –

+0

@Tim: Ứng dụng web của bạn đã chịu trách nhiệm về cấu hình bởi thực tế là các giá trị cấu hình được lưu trữ với chính trang web đó. Hơn nữa các ứng dụng web dường như gọi lắp ráp (nó không đứng một mình sau khi tất cả). Đây là "mối quan tâm" sai "tách". – NotMe

+0

@Chris: cài đặt cho tất cả các hội đồng được gọi bởi ứng dụng web được lưu trữ trong web.config. Đó là cách .NET hoạt động - chỉ một tệp cấu hình cho mỗi AppDomain. Đó là hợp lý để anh ta không vượt qua đường dẫn đến thư viện, vì các thư viện khác nhau có thể có các đường dẫn khác nhau hoặc cấu hình khác. –

0

Ví dụ

Trong web.config của bạn

<appSettings> 
     <add key="FilePath" value="~/images"/> 
    </appSettings> 

và In mã của bạn đằng sau cs nộp

string filters = "*.jpg;*.png;*.gif"; 
    string Path = ConfigurationManager.AppSettings["FilePath"].ToString(); 

    List<String> images = new List<string>(); 

    foreach (string filter in filters.Split(';')) 
    { 
     FileInfo[] fit = new DirectoryInfo(this.Server.MapPath("~/images")).GetFiles(filter); 
     foreach (FileInfo fi in fit) 
     { 
      images.Add(String.Format(Path + "/{0}", fi));     
     } 
    } 

    RepeaterImages.DataSource = images; 
    RepeaterImages.DataBind(); 
0

Bạn cũng có thể làm điều này:

Trong web. cấu hình:

<add key="MyFileLocation" value="content/dataMyDataFile.txt" /> 

Trong mã của bạn:

string filePath = ConfigurationManager.AppSettings["MyFileLocation"]; 
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath) 

Kết quả sẽ cung cấp cho một cái gì đó như: "C: \ yourproj \ nội dung \ dataMyDataFile" hoặc một cái gì đó như thế.

Các vấn đề liên quan