【问题标题】:Get path to My Documents获取我的文档的路径
【发布时间】:2011-01-25 18:27:11
【问题描述】:

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

编辑:

我有这个:

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

但是,result 将返回 E_INVALIDARG 的值。关于为什么会这样的任何想法?

【问题讨论】:

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


    【解决方案1】:

    使用the SHGetFolderPath Windows API function 并请求CSIDL_MYDOCUMENTS

    【讨论】:

    【解决方案2】:

    这取决于您需要兼容的系统的年龄。对于旧系统,有SHGetSpecialFolderPath。对于较新的系统,有SHGetFolderPath。从 Vista 开始,有SHGetKnownFolderPath

    这里有一些演示代码,至少在我的机器上有效:

    #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;
    }
    

    【讨论】:

    • 谢谢 - 我已经尝试过 SHGetFolderPath,但有些东西不太正常 - 你介意看看我在问题中的编辑吗?
    • 这似乎是一个 python 内置。 stackoverflow.com/questions/6227590/…
    • 仅供参考,直接来自 ShlObj.h:#define CSIDL_MYDOCUMENTS CSIDL_PERSONAL // Personal 只是 My Documents 的一个愚蠢的名称
    【解决方案3】:

    请注意,如果用户更改了 Win7 文档库中的默认保存文件夹,CSIDL_PERSONAL 将不会返回所需的文件夹。要获取正确的文件夹,需要使用SHLoadLibraryFromKnownFolder获取Documents库的IShellLibrary,使用IShellLibrary::GetDefaultSaveFolder获取库默认保存文件夹的IShellItem,最后使用IShellItem::GetDisplayName获取文件夹名称。

    【讨论】:

      【解决方案4】:
      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;
      

      这个解决方案怎么样?它对我来说工作正常。

      【讨论】:

      • 看来您没有使用 csidl 参数。如果我理解得很好,它可能应该作为 SHGetFolderPathW() 的第二个参数而不是 CSIDL_MYDOCUMENTS。
      【解决方案5】:

      在 Windows 10 下使用带有 MFC 应用程序的 Visual Studio 2017 我正在使用以下代码 sn-p 和 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*

      当这个方法返回时,包含一个指针的地址 以 null 结尾的 Unicode 字符串,指定已知的路径 文件夹。调用进程负责释放这个资源 一旦不再需要调用CoTaskMemFree。返回的 path 不包含尾部反斜杠。例如,“C:\Users”是 返回而不是“C:\Users\”。

      有关可能的 FOLDERID_ 参数列表,请参阅 MSDN 文章 KNOWN_FOLDER_FLAG enumeration

      【讨论】:

        猜你喜欢
        • 2012-03-29
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        相关资源
        最近更新 更多