Tôi đã thử nghiệm bằng cách sử dụng SHGetFolderPath()
với Visual Studio 2015 Enterprise trên PC Windows 10 và nó được biên dịch và hoạt động tốt để tìm thư mục chính của người dùng hiện tại. Trong trang của Windows Dev Center trên SHGetFolderPath()
SHGetFolderPath function có các lưu ý sau:
Note Tính đến Windows Vista, chức năng này chỉ đơn thuần là một wrapper cho SHGetKnownFolderPath
. Giá trị CSIDL
được dịch sang số KNOWNFOLDERID
được liên kết và sau đó gọi là SHGetKnownFolderPath
. Ứng dụng mới nên sử dụng hệ thống thư mục đã biết thay vì hệ thống thư mục cũ hơn CSIDL
chỉ được hỗ trợ để tương thích ngược.
Như David Heffman đã chỉ ra câu trả lời của mình, Microsoft có lịch sử giữ tính tương thích ngược trong nhiều năm, đặc biệt khi họ có thể thực hiện chức năng cũ hơn và chuyển hướng đến chức năng mới. Giá trị CSIDL
dường như có giá trị KNOWNFOLDERID
tương ứng.Xem này table of the CSIDL
constants với chú thích ngắn gọn và giá trị KNOWNFOLDERID
tương ứng.
Ví dụ về việc sử dụng hàm sau. Việc sử dụng này truy xuất thư mục người dùng hiện tại của người dùng (ví dụ: "C: \ Users \ myuser \ Documents" trong Windows 7) và sau đó thêm tên thư mục vào cuối đường dẫn bằng cách sử dụng hàm PathAppend()
.
TCHAR achDevice[MAX_PATH];
HRESULT hr;
// include file ShlObj.h contains list of CSIDL defines however only a subset
// are supported with Windows 7 and later.
// for the 3rd argument, hToken, can be a specified Access Token or SSID for
// a user other than the current user. Using NULL gives us the current user.
if (SUCCEEDED(hr = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, achDevice))) {
// append a folder name to the user's Documents directory.
// the Path Handling functions are pretty handy.
PathAppend(achDevice, L"xxx");
}
Một lỗi có thể xảy ra là một hoặc nhiều đối số không hợp lệ (hr == E_INVALIDARG
). Giá trị trả lại là S_OK
cho biết cuộc gọi đã thành công.
Có một vài hằng số CSIDL
có thể được sử dụng để sửa đổi kết quả của hàm như CSIDL_FLAG_CREATE
bằng cách sử dụng toán tử bitwise OR. Tôi không chắc các nhà khai thác đó sẽ hoạt động tốt như thế nào với Windows 7 trở lên.
Có giới hạn đối với hằng số được hỗ trợ CSIDL
với Windows 7 trở lên. Nó cũng giống như có thể có các vấn đề có thể khắc phục trong các thư mục phức tạp, từ xa được gắn kết, chuyển hướng và/hoặc chia sẻ trong Active Directory hoặc môi trường tương tự.
Xem thêm KNOWNFOLDERID bao gồm bảng cho biết một số giới hạn của CSIDL
và SHGetFolderPath()
. Một số ví dụ từ bảng số CSIDL
hằng số có thể hữu ích.
CSIDL_LOCAL_APPDATA - %USERPROFILE%\AppData\Local
CSIDL_MYDOCUMENTS - %USERPROFILE%\Document
CSIDL_PERSONAL - %USERPROFILE%\Documents
CSIDL_FONTS - %windir%\Fonts
CSIDL_MYMUSIC - %USERPROFILE%\Music
CSIDL_MYPICTURES - %USERPROFILE%\Pictures
CSIDL_COMMON_APPDATA - %ALLUSERSPROFILE% (%ProgramData%, %SystemDrive%\ProgramData)
CSIDL_COMMON_DOCUMENTS - %PUBLIC%\Documents
Bằng cách này, Shell Path Handling Functions là thư viện phương pháp tốt để thao tác đường dẫn tệp.
Xem thêm Where to put common writable application files?
Xem: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx và http://msdn.microsoft .com/vi-us/library/windows/desktop/bb762188 (v = vs.85) .aspx và cuối cùng, http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v= vs.85) .aspx – enhzflep