2009-05-15 29 views
295

C# 2008 SP1C# nhận được đường đi của% AppData%

Tôi đang sử dụng mã bên dưới:

dt.ReadXml("%AppData%\\DateLinks.xml"); 

Tuy nhiên, tôi nhận được một ngoại lệ trỏ đến vị trí của nơi ứng dụng của tôi đang chạy từ:

không thể tìm thấy một phần của đường dẫn 'D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml'.

Tôi nghĩ rằng %AppData% nên tìm đường dẫn tương đối. Khi tôi đi Start|Run|%AppData% windows explorer đưa tôi đến thư mục đó.

Tôi không thể đặt đường dẫn đầy đủ, vì người dùng khác nhau trên mỗi máy khách.

Rất cám ơn cho lời khuyên nào,

Trả lời

635

Để có được AppData thư mục , nó là tốt nhất để sử dụng GetFolderPath phương pháp:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

%AppData% là một biến môi trường, và họ không được tự động mở rộng bất cứ nơi nào trong .NET, mặc dù bạn có thể sử dụng phương thức Environment.ExpandEnvironmentVariable một cách rõ ràng để làm như vậy. Tuy nhiên, tôi vẫn mạnh mẽ khuyên bạn nên sử dụng GetFolderPath, vì như Johannes Rössel chỉ ra trong nhận xét, %AppData% có thể không được đặt trong một số trường hợp nhất định.

Cuối cùng, để tạo ra con đường như trong ví dụ của bạn:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml"); 
+36

+1 để cung cấp giải pháp thực sự, không dựa vào môi trường. Để thêm vào câu trả lời: Không phải mọi chức năng xử lý tên tệp đều mở rộng các biến môi trường. Trong thực tế, thông thường bạn phải rõ ràng làm điều này, nếu không nó không hoạt động và bạn sẽ kết thúc với% something% folders. Hơn nữa, môi trường không cần phải có mặt, trong một số trường hợp khi chạy một chương trình trong một tài khoản người dùng khác, môi trường của người dùng sẽ không được tải và% Appdata% sẽ trống. Đó là lý do tại sao bạn muốn sử dụng các API được ghi lại để nhận các thư mục đó (trừ khi bạn đang sử dụng các tệp lô). – Joey

+0

@Johannes: Thông tin tốt ở đó. Tôi chỉ sửa đổi câu trả lời của tôi khi bạn đăng bài đó, nhưng tôi sẽ làm cho nó rõ ràng hơn rằng GetFolderPath chắc chắn là thích hợp hơn ExpandEnvironmentVariable. – Noldorin

+0

+1 cho môi trường.GetFolderPath (Environment.SpecialFolder.ApplicationData), tôi đã đứng sau này trong vài ngày nay. –

6

Tôi không nghĩ rằng việc đưa% AppData% trong một chuỗi như thế sẽ làm việc.

thử

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString() 
19

Bạn cũng có thể sử dụng

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml"); 

để mở rộng biến %AppData%.

43

Đường dẫn khác nếu bạn đang nói ASP.NET.

Tôi không thể tìm thấy bất kỳ giá trị 'SpecialFolder' nào trỏ đến/App_Data cho ASP.NET.

Thay vào đó bạn cần phải làm điều này:

HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data") 

(Lưu ý: Bạn không cần tài sản 'hiện tại' trong một Controller MVC)

Nếu theres một cách khác hơn 'trừu tượng' để có được đến App_Data rất thích nghe như thế nào.

+0

Chỉ cần lưu ý vì lõi asp.net sắp ra mắt. Cách tiếp cận này dựa trên IIS. –

+3

'HostingEnvironment.MapPath (@" ~/App_Data ")' là tốt hơn và hoạt động trong cả hai ngữ cảnh MVC/WebAPI và WCF mà không có HttpContext - nhưng không chắc chắn về lõi ' –

13

Trong .net2.0 bạn có thể sử dụng biến Application.UserAppDataPath

+19

Đây chỉ là Winforms. – Will

20

Các NHẤT cách để sử dụng thư mục AppData, sử dụng Environment.ExpandEnvironmentVariable phương pháp.

Lý do:

  • nó thay thế các bộ phận của chuỗi của bạn với danh bạ hợp lệ hoặc bất cứ điều gì
  • nó là case-insensitive
  • nó rất dễ dàng và không phức tạp
  • nó là một tiêu chuẩn
  • tốt để xử lý thông tin nhập của người dùng

Ví dụ amples:

string path; 
path = "%AppData%\stuff"; 
path = "%aPpdAtA%\HelloWorld"; 
path = "%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths 

path = Environment.ExpandEnvironmentVariables(path); 
Console.WriteLine(path); 

Ghi một số người dùng gõ %AppData%, một số %appdata% và một số %APpData% Bạn không muốn kết thúc với:

if (path.ToLower().StartsWith("%appdata%")) 
    ; // path manipulation 
if (path.ToLower().StartsWith("%programfiles%")) 
    ; // path manipulation 

Nếu biến môi trường không được thiết lập, nó không phải là của bạn lỗi (bên cạnh khi nó IS). Tôi thường không nói với mọi người để không tái phát minh ra bánh xe nhưng sau khi tôi lần đầu tiên đi theo cách khác và nhận ra rằng đó là một ý tưởng tồi.

+0

Đã thích các ví dụ về biến 'đường dẫn' của bạn :) – RBT

3

Chỉ muốn chia sẻ một cách khác để truy cập thư mục 'App_Data' trong ứng dụng mvc của tôi trong trường hợp ai đó cần điều này.

Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data") 
+0

Có thể không phải là câu trả lời đúng, nhưng đó là những gì tôi đang tìm kiếm. +1 – Derrick

+0

Làm việc cho tôi sau khi thay thế dấu nháy đơn với dấu ngoặc kép. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data") – ajaysinghdav10d

+0

@ ajaysinghdav10d điểm tốt Tôi đã cập nhật câu trả lời của mình – cpoDesign

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