2008-09-25 13 views
14

Nơi thích hợp để lưu trữ các tệp dữ liệu chương trình giống nhau cho mỗi người dùng nhưng phải ghi cho chương trình? Điều gì sẽ là vị trí tương đương trên MS Windows XP? Tôi đã đọc rằng C: \ ProgramData không thể ghi được sau khi cài đặt bởi người dùng bình thường. Điều đó có đúng không? Làm cách nào tôi có thể truy xuất thư mục đó bằng lập trình bằng SDK nền tảng?Vista và ProgramData

Trả lời

8

SHGetFolderPath() với CSIDL của CSIDL_COMMON_APPDATA.

Đọc thêm tại http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx

Nếu bạn cần các con đường trong một tập tin thực thi, bạn cũng có thể sử dụng biến môi trường%% ALLUSERSPROFILE.

+1

Tôi tin rằng đó thực sự là% ALLUSERSPROFILE%, với S –

+0

Err, vâng, đó là chính xác, tôi đã bỏ lỡ một S. :-) –

1

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

CString strPath; 
::SHGetSpecialFolderPath(NULL, strPath.GetBuffer(1024), CSIDL_COMMON_APPDATA, FALSE); 
1

Xem Raymond Chen's article on this specific question.

Tóm lại, bạn đang yêu cầu lỗ bảo mật .

+3

Ứng dụng sẽ không được sử dụng bởi quản trị viên và mọi người có thể đăng nhập vào máy tính trong các công ty chúng tôi đang xử lý. Vì vậy, nó không phải là một vấn đề an ninh để có dữ liệu được chia sẻ giữa người dùng. Trên Vista người ta có thể chia sẻ hình ảnh và phim trong một thư mục công cộng. Progams nên có điều này quá. – frast

7

Có một tóm tắt tuyệt vời trong những lựa chọn khác nhau ở đây: http://blogs.msdn.com/cjacks/archive/2008/02/05/where-should-i-write-program-data-instead-of-program-files.aspx

Tôi có nên Viết chương trình dữ liệu Thay vì Program Files ở đâu?

Một cập nhật mã ứng dụng phổ biến là này:. "Ứng dụng của tôi sử dụng để viết file chương trình file Nó cảm thấy như một nơi tốt để đặt nó như bất kỳ Nó có tên ứng dụng của tôi khác trên nó rồi. Và bây giờ tôi thấy rằng đây có thể không phải là một nơi tuyệt vời để gắn kết những thứ như tôi đã từng nghĩ, vì với UAC, ngay cả quản trị viên chạy với các đặc quyền giống như người dùng chuẩn phần lớn thời gian. Vì vậy, tôi nên đặt các tệp của mình ở đâu để thay thế?

4

Thực tế, SHGetFolderPath không còn được dùng nữa.

SHGetKnownFolderPath nên được sử dụng thay thế.

+0

Nếu tôi sử dụng SHGetKnownFolderPath phần mềm của tôi sẽ chỉ chạy trong Windows Vista. SHGetFolderPath cũng hoạt động từ Windows 2000 và Vista. – frast

+0

@frast, vâng, nhưng bạn có thể kiểm tra tính khả dụng của SHGetKnowFolderPath và sử dụng nó nếu thoát. Sau đó, ứng dụng của bạn sẽ là bằng chứng trong tương lai và hoạt động trên các phiên bản Windows, nơi SHGetFolderPath bị loại bỏ, cũng như trên Windows 2000. –

+1

@Tự động tôi sẽ làm điều này, nhưng tôi đợi cho đến khi tôi thấy Phiên bản Windows không hỗ trợ SHGetFolderPath. – frast