我已经在Windows 10 PC上使用Visual Studio 2015 Enterprise测试了SHGetFolderPath()
,并且编译和查找当前用户的主文件夹工作正常。在Windows Dev Center页面上关于SHGetFolderPath()
SHGetFolderPath function有以下说明:
注意 自Windows Vista以来,此函数仅是SHGetKnownFolderPath
的包装器。 CSIDL
值被翻译为其关联的KNOWNFOLDERID
,然后调用SHGetKnownFolderPath
。新应用程序应使用已知文件夹系统而不是仅支持向后兼容性的旧CSIDL
系统。
正如David Heffman在他的回答中指出的那样,微软有一个长期保持向后兼容性的历史,特别是当他们可以采用旧函数并将其重定向到具有适当参数的新函数时。 CSIDL
值似乎有相应的 KNOWNFOLDERID
值。请参见此 CSIDL
常量表,其中包含简要注释和相应的 KNOWNFOLDERID
值。
以下是使用该函数的示例。此用法检索当前用户的用户文件夹(例如,在 Windows 7 下为 "C:\Users\myuser\Documents"),然后使用 PathAppend()
函数将文件夹名称添加到路径末尾。
TCHAR achDevice[MAX_PATH];
HRESULT hr;
if (SUCCEEDED(hr = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, achDevice))) {
PathAppend(achDevice, L"xxx");
}
可能的一个失败原因是一个或多个无效参数(hr == E_INVALIDARG
)。返回值为S_OK
表示调用成功。
有一些CSIDL
常量可以用于修改函数的结果,例如使用按位OR运算符的CSIDL_FLAG_CREATE
。我不确定这些运算符在Windows 7及更高版本中的工作情况如何。
在Windows 7及更高版本中,支持的CSIDL
常量有限制。在Active Directory或类似环境中的复杂、远程挂载、重定向和/或共享文件夹中可能存在一些问题需要解决。
另请参阅KNOWNFOLDERID,其中包括一个表格,指出了CSIDL
和SHGetFolderPath()
的一些限制。以下是表格中一些有用的CSIDL
常量的示例。
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
顺便提一下,Shell Path Handling Functions 是一个不错的库,可以用来操作文件路径。
另外还可以参考 在哪里放置常见的可写应用程序文件?