我已经SHGetFolderPath()
在 Windows 10 PC 上使用 Visual Studio 2015 Enterprise 进行了测试,它编译并工作得很好,可以找到当前用户的主文件夹。在SHGetFolderPath()
SHGetFolderPath 函数的 Windows 开发中心页面中,有以下注释:
注意 从 Windows Vista 开始,此函数只是
SHGetKnownFolderPath
. 该CSIDL
值被转换为与其关联
的值KNOWNFOLDERID
,然后SHGetKnownFolderPath
被调用。新应用程序应使用已知的文件夹系统,而不是旧
CSIDL
系统,后者仅支持向后兼容。
正如大卫赫夫曼在他的回答中指出的那样,微软多年来一直保持向后兼容性,特别是当他们可以采用旧功能并使用适当的参数将其重定向到新功能时。这些CSIDL
值似乎具有相应的KNOWNFOLDERID
值。请参阅带有简短注释和相应值的常量表。CSIDL
KNOWNFOLDERID
下面是该函数的使用示例。PathAppend()
此用法检索当前用户的用户文件夹(例如 Windows 7 下的“C:\Users\myuser\Documents”),然后使用该函数将文件夹名称添加到路径的末尾。
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");
}
一种可能的失败是一个或多个无效参数(hr == E_INVALIDARG
)。返回值S_OK
表示调用成功。
有一些CSIDL
常量可用于修改函数的结果,例如CSIDL_FLAG_CREATE
使用按位或运算符。我不确定这些运算符在 Windows 7 及更高版本上的工作情况如何。
CSIDL
Windows 7 及更高版本支持的常量存在限制。看起来在 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 路径处理函数是一个很好的文件路径处理方法库。
另请参阅在哪里放置常见的可写应用程序文件?