获取我的文档的路径

时间:2010-03-10 05:54:48

标签: c++ visual-c++ mfc

从Visual C ++,如何获取当前用户的“我的文档”文件夹的路径?

修改

我有这个:

TCHAR my_documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents);

但是,result的回复值为E_INVALIDARG。有关为什么会这样的想法吗?

5 个答案:

答案 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