从Visual C ++,如何获取当前用户的“我的文档”文件夹的路径?
修改
我有这个:
TCHAR my_documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents);
但是,result
的回复值为E_INVALIDARG
。有关为什么会这样的想法吗?
答案 0 :(得分:19)
这取决于您需要兼容的系统的年龄。对于旧系统,有SHGetSpecialFolderPath。对于某些较新的系统,有SHGetFolderPath。从Vista开始,有SHGetKnownFolderPath。
修改:您想使用CSIDL_PERSONAL
,而不是CSIDL_MYDOCUMENTS
。有效的演示代码,至少在我的机器上:
#include <windows.h>
#include <iostream>
#include <shlobj.h>
#pragma comment(lib, "shell32.lib")
int main() {
CHAR my_documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents);
if (result != S_OK)
std::cout << "Error: " << result << "\n";
else
std::cout << "Path: " << my_documents << "\n";
return 0;
}
答案 1 :(得分:9)
使用the SHGetFolderPath
Windows API function并请求CSIDL_MYDOCUMENTS
。
答案 2 :(得分:1)
请注意,如果用户更改了Win7文档库中的默认保存文件夹,则CSIDL_PERSONAL将不会返回所需的文件夹。要获取正确的文件夹,您需要使用SHLoadLibraryFromKnownFolder
获取文档库的IShellLibrary
,使用IShellLibrary::GetDefaultSaveFolder
获取库的默认保存文件夹的IShellItem
,以及最后使用IShellItem::GetDisplayName
获取文件夹名称。
答案 3 :(得分:1)
std::string GetSystemFolderPaths(int csidl)
{
wchar_t Folder[1024];
HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS, 0, 0, Folder);
if (SUCCEEDED(hr))
{
char str[1024];
wcstombs(str, Folder, 1023);
return str;
}
else return "";
}
cout<<GetSystemFolderPaths(CSIDL_MYDOCUMENTS)<<endl;
这个解决方案怎么样?它对我来说很好。
答案 4 :(得分:1)
在Windows 10下使用Visual Studio 2017和MFC应用程序我使用以下代码段和SHGetKnownFolderPath function来获取当前用户的Documents文件夹:
#include <string> // include file for C++ native strings
// . . . other code.
PWSTR ppszPath; // variable to receive the path memory block pointer.
HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &ppszPath);
std::wstring myPath;
if (SUCCEEDED(hr)) {
myPath = ppszPath; // make a local copy of the path
}
CoTaskMemFree(ppszPath); // free up the path memory block
请注意,文档中有关于路径变量用法和返回路径的说法:
ppszPath [out]
类型:PWSTR *
当此方法返回时,包含指向a的指针的地址 以null结尾的Unicode字符串,用于指定已知的路径 夹。调用进程负责释放此资源 一旦调用
CoTaskMemFree
不再需要它。归来了 path不包含尾部反斜杠。例如,“C:\ Users”是 返回而不是“C:\ Users \”。
有关FOLDERID_
个参数的列表,请参阅MSDN文章KNOWN_FOLDER_FLAG enumeration。