C # nhận đường dẫn của% AppData%


387

C # 2008 SP1

Tôi đang sử dụng mã dưới đây:

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

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

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

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

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

Câu trả lời:


802

Để có được thư mục AppData , tốt nhất là sử dụng GetFolderPathphương thức:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(phải thêm using Systemnếu không có mặt).

%AppData%là một biến môi trường và chúng không được tự động mở rộng ở bất kỳ đâu trong .NET, mặc dù bạn có thể sử dụng Environment.ExpandEnvironmentVariablephương thức này một cách rõ ràng . GetFolderPathTuy nhiên, tôi vẫn đề nghị bạn nên sử dụng , bởi vì như Julian Rössel chỉ ra trong bình luận, %AppData%có thể không được đặt trong một số trường hợp nhất định.

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

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

45
+1 để đưa ra một 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 hàm 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 làm điều này một cách rõ ràng, nếu không nó không hoạt động và bạn sẽ kết thúc với% thư mục%. 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 chương trình dưới 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 tài liệu để nhận các thư mục đó (trừ khi bạn đang sử dụng các tệp bó).
Joey

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

+1 cho Môi trường.GetFolderPath (Môi trường. SpecialFolder.ApplicationData), tôi đã đứng sau điều này trong vài ngày nay.
Sumit Ghosh

1
Vì một số lý do Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)trả về chuỗi trống cho tôi (IIS 7, VS 2011). Vấn đề được giải quyết bằng giải pháp Simon_Weaver - ánh xạ sử dụng MapPath.
Mike Keskinov

52
FYI cung cấp thư mục Chuyển vùng cho Môi trường AppData cục
bộ.GetFolderPath

49

Đường dẫn sẽ 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 được 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 thuộc tính 'Hiện tại' trong Bộ điều khiển MVC)

Nếu có một cách khác "trừu tượng" hơn để có App_Datathể thích nghe làm thế nào.


Chỉ cần một lưu ý kể từ khi asp.net cốt lõi sắp ra mắt. Cách tiếp cận này dựa cụ thể vào IIS.
George Mauer

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

37

Cách TỐT NHẤT để sử dụng thư mục AppData, IS để sử dụngEnvironment.ExpandEnvironmentVariable phương thức.

Lý do:

  • nó thay thế các phần của chuỗi của bạn bằng các thư mục hợp lệ hoặc bất cứ điều gì
  • nó không phân biệt chữ hoa chữ thường
  • nó dễ dàng và không phức tạp
  • nó là một tiêu chuẩn
  • tốt để xử lý đầu vào của người dùng

Ví dụ:

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

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

Hãy nhớ một số loại người dùng %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 đặt, đó không phải là lỗi của bạn (ngoài khi nó là IS ). Tôi thường không nói với mọi người là không phát minh lại bánh xe nhưng sau khi tôi lần đầu tiên đi theo con đường khác và nhận ra rằng đó là một ý tưởng tồi.


Thích các ví dụ về pathbiến của bạn :)
RBT

+1 Environment.ExpandEnvironmentVariablelà tốt nhất khi bạn chỉ cần mở rộng bất kể vars env nào có thể nằm trong chuỗi đường dẫn.
blins

24

Bạn cũng có thể dùng

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

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


15

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


20
Đây chỉ là Winforms.

7

Tôi không nghĩ việc đặt% AppData% trong một chuỗi như thế sẽ hiệu quả.

thử

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

4

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")

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

Làm việc cho tôi sau khi thay thế dấu ngoặc đơn bằng dấu ngoặc kép. Path.Combine (httpR.78.AppDomainAppPath, "App_Data")
ajaysinghdav10d

1

Điều này làm việc cho tôi trong một ứng dụng giao diện điều khiển -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");

1

Đối với ASP.NET, Load User Profilecài đặt cần phải được đặt trên nhóm ứng dụng nhưng điều đó là không đủ. Có một cài đặt ẩn có tên setProfileEnvironmenttrong \Windows\System32\inetsrv\Config\applicationHost.configđó, vì một số lý do bị tắt theo mặc định, thay vì bật như được mô tả trong tài liệu . Bạn có thể thay đổi mặc định hoặc đặt nó trên nhóm ứng dụng của mình. Tất cả các phương thức trên Environmentlớp sau đó sẽ trả về các giá trị thích hợp.

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.