2008-12-28 26 views
50

Vị trí được đề xuất để lưu tệp tùy chọn của người dùng là gì? Có phương pháp được đề xuất nào để xử lý các tùy chọn của người dùng không?WPF/C#: Tôi nên lưu tệp tùy chọn của người dùng ở đâu?

Hiện tại tôi sử dụng đường dẫn được trả về từ typeof(MyLibrary).Assembly.Location làm vị trí mặc định để lưu trữ các tệp do ứng dụng tạo hoặc yêu cầu.

EDIT: tôi thấy hai liên quan/câu hỏi thú vị:

EDIT # 2: Đây chỉ là một lưu ý cho những người như tôi chưa bao giờ sử dụng cài đặt trước. Cài đặt khá hữu ích, nhưng tôi phải thực hiện cả một loạt việc đào bới để tìm ra những gì đang xảy ra (đến từ thế giới Python, không phải thứ tôi cũng sử dụng). Mọi thứ trở nên phức tạp vì tôi muốn lưu các từ điển và dường như chúng không thể được tuần tự hóa. Cài đặt cũng dường như được lưu trữ trong 3 tệp khác nhau tùy thuộc vào việc bạn làm. Có một số app.config, user.config và tệp settings.setting. Vì vậy, đây là hai liên kết mà tôi thấy hữu ích:

Trả lời

66

Bạn có thể sử dụng Cài đặt ứng dụng dễ dàng đủ.

Nếu bạn chưa làm như vậy trước khi chỉ cần nhấp chuột phải vào dự án và chọn Thuộc tính. Chọn tab Cài đặt. Đảm bảo bạn đã chọn "Người dùng" cho phạm vi (nếu không cài đặt là chỉ đọc).

Mã để truy cập này rất đơn giản:

forms.Width = Application1.Properties.Settings.Default.Width; 

Nếu bạn cần phải lưu nó:

Application1.Properties.Settings.Default.Width = forms.Width; 
Application1.Properties.Settings.Default.Save(); 

Trong ví dụ trên, Width là tên thiết lập tùy chỉnh bạn xác định trong tab Cài đặt và Application1 là Không gian tên của ứng dụng của bạn.

Chỉnh sửa: Đối phó với thắc mắc gì thêm

Bạn nói bạn muốn để lưu trữ đối tượng điển trong Cài đặt. Khi bạn phát hiện ra, bạn không thể làm điều này trực tiếp vì các đối tượng từ điển không thể tuần tự hóa được. Tuy nhiên, bạn có thể tạo từ điển serializable của riêng bạn khá dễ dàng. Paul Welzer đã có một ví dụ tuyệt vời on his blog.

Bạn có một vài liên kết có tình trạng lộn xộn một chút. Câu hỏi ban đầu của bạn là nơi để lưu "User Preference Files". Tôi khá chắc chắn ý định của Microsoft với chức năng Cài đặt chính xác là ... lưu trữ sở thích da của người dùng, lựa chọn bố cục, v.v. Nó không có nghĩa là kho lưu trữ chung cho dữ liệu của ứng dụng mặc dù nó có thể dễ dàng bị lạm dụng theo cách đó.

Dữ liệu được lưu trữ ở những nơi riêng biệt vì một lý do chính đáng. Một số cài đặt là Cài đặt ứng dụng và chỉ đọc.Đây là những cài đặt mà ứng dụng cần hoạt động nhưng không cụ thể cho người dùng (ví dụ: URI đối với tài nguyên ứng dụng hoặc có thể là thuế suất). Chúng được lưu trữ trong app.config.

Cài đặt người dùng được lưu trữ trong thư mục bị làm mờ sâu trong thư mục Tài liệu/Cài đặt người dùng. Các giá trị mặc định được lưu trữ trong app.config (tôi nghĩ, không thể nhớ lại một số từ đầu của tôi) nhưng bất kỳ thay đổi người dùng được lưu trữ trong thư mục cá nhân của họ. Điều này có nghĩa là cho dữ liệu thay đổi từ người dùng sang người dùng. (Theo "người dùng", tôi có nghĩa là người dùng Windows, không phải người dùng ứng dụng của bạn.)

Hy vọng điều này sẽ làm rõ điều này một phần cho bạn. Hệ thống này thực sự khá đơn giản. Nó có thể có vẻ hơi nước ngoài lúc đầu nhưng sau một vài ngày sử dụng nó, bạn sẽ không bao giờ phải nghĩ về nó một lần nữa ... nó chỉ hoạt động.

+0

khi bạn nói mã truy cập là: forms.Width = Application1.Properties.Settings.Default.Width; Điều này có nghĩa là nó tải Chiều rộng có thể được lưu trong phiên trước không? – Sharun

+0

Btw cảm ơn câu trả lời. Đã học một cái gì đó mới ở đây, – Sharun

+1

Vâng, mẫu nhỏ mà anh ấy cung cấp sẽ khôi phục chiều rộng trước đó.Nếu bạn định sử dụng nó (cùng với chiều cao và vị trí), hãy đảm bảo bạn có một số kiểm tra để đảm bảo cửa sổ hiển thị. Khôi phục vị trí là một tính năng xấu cho người dùng màn hình kép khi họ xóa vị trí thứ hai. – Samuel

27

Khi chạy không phải là quản trị viên hoặc trên Vista, bạn không thể ghi vào thư mục "Tệp chương trình" (hoặc bất kỳ thư mục con nào của nó).

Các vị trí đúng sở thích cửa hàng sử dụng là (thay thế MyCompanyName và MyApplicationName với tên chính xác, rõ ràng)

Mở đĩa:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyCompanyName\\MyApplicationName" 

Hoặc trong registry dưới khóa:

HKEY_CURRENT_USER\Software\MyCompanyName\MyApplicationName 

Các vị trí đó là cho mỗi người dùng và chúng hoạt động với người dùng không phải quản trị viên, một số người dùng sử dụng cùng một máy tính, chuyển đổi người dùng nhanh, dịch vụ đầu cuối và tất cả cách mọi người có thể tương tác với phần mềm của bạn.

Nếu bạn cần một địa điểm chung cho tất cả người dùng sau đó:

  1. Nó sẽ chỉ làm việc khi chạy người sử dụng như một quản trị viên
  2. Nó sẽ không làm việc đáng tin cậy trên Vista
  3. Bạn phải chăm sóc của tất cả mọi thứ cho mình (giống như hai người dùng đang chạy ứng dụng trên cùng một máy tính cùng một lúc thông qua chuyển đổi người dùng nhanh).

và các địa điểm là:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationCommonData) + "\\MyCompanyName\\MyApplicationName" 

Hoặc trong registry dưới khóa:

HKEY_LOCAL_MACHINE\Software\MyCompanyName\MyApplicationName 
+0

Cảm ơn Nir. Cách thay thế đầu tiên của bạn giống như những gì tôi đang tìm kiếm. – Sharun

+1

Tôi nghĩ rằng thứ hai của bạn nên là CommonApplicationData, không phải ApplicationCommonData. –

+1

"bạn không thể ghi vào" tệp Chương trình "- bạn không được viết ở đó ngay cả khi bạn có đặc quyền quản trị viên. –

1

sau có vẻ là lựa chọn tốt nhất:

Application.UserAppDataPath 
+0

Điều này không có sẵn trong WPF, có thể chỉ trong WinForms? – stijn

+0

Đúng, xin lỗi, câu trả lời là -1 vì đây là câu trả lời duy nhất của 'WinForms' và tiêu đề của câu hỏi đặc biệt yêu cầu' WPF'. –

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