如何使用 C++ 打开 %appdata% 中的文件夹?

新手上路,请多包涵

众所周知,appdata文件夹是这个

 C:\Users\*Username*\AppData\Roaming

在 Windows 7 上

由于我的应用程序将部署在各种 Windows 操作系统上,因此我需要能够 100% 地获取文件夹。问题是你如何在 C++ 中做到这一点?因为我不知道确切的 Windows 操作系统,它可能是 XP、Vista 或 7,最重要的是我不知道 用户名 是什么。

原文由 dikidera 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

为了最大限度地兼容所有版本的 Windows,您可以使用 SHGetFolderPath 函数

它要求您为要检索其路径的文件夹指定 CSIDL 值。对于应用程序数据文件夹,这将是 CSIDL_APPDATA

在 Windows Vista 及更高版本上,您应该改用 SHGetKnownFolderPath 函数,这需要您指定文件夹的 KNOWNFOLDERID 值。同样,对于应用程序数据文件夹,适当的值为 FOLDERID_RoamingAppData

要在 C++ 应用程序中使用这些函数中的任何一个,您需要包含 shlobj.h

原文由 Cody Gray 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果有人正在寻找一个简单的实现,这是我的:

 #include <windows.h>
#include <shlobj.h>

#include <filesystem>
#include <iostream>

int main(void)
{
    std::filesystem::path path;
    PWSTR path_tmp;

    /* Attempt to get user's AppData folder
     *
     * Microsoft Docs:
     * https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderpath
     * https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid
     */
    auto get_folder_path_ret = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &path_tmp);

    /* Error check */
    if (get_folder_path_ret != S_OK) {
        CoTaskMemFree(path_tmp);
        return 1;
    }

    /* Convert the Windows path type to a C++ path */
    path = path_tmp;

    /* Free memory :) */
    CoTaskMemFree(path_tmp);

    std::cout << path << std::endl;

    return 0;
}

原文由 Phil Loctaux 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏