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

dik*_*era 16 c++ appdata

众所周知,appdata文件夹就是这样

 C:\Users\*Username*\AppData\Roaming
Run Code Online (Sandbox Code Playgroud)

在Windows 7上

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

Cod*_*ray 22

为了最大程度地兼容所有版本的Windows,您可以使用该SHGetFolderPath功能.
它要求您为要检索其路径的文件夹指定CSIDL值.对于应用程序数据文件夹,即可CSIDL_APPDATA.

在Windows Vista及更高版本中,您应该使用该SHGetKnownFolderPath功能,这需要您指定文件夹的KNOWNFOLDERID值.同样,对于应用程序数据文件夹,适当的值是FOLDERID_RoamingAppData.

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

  • @mfce:呃,第一个是您应该在 Vista 之前的 Windows 版本(如 Windows 2000 和 XP)上使用的。但是,从 Windows Vista 开始,它已被弃用,为 Vista 和 7 编写的新应用程序应始终使用第二个。所以这取决于程序运行在哪个版本的Windows上。 (2认同)

ipt*_*ptq 17

您可以尝试以下方法:

char* appdata = getenv("APPDATA");
Run Code Online (Sandbox Code Playgroud)

此代码读取环境变量APPDATA(您在键入SET命令窗口时也可以看到它).它在系统启动时由Windows设置.

它将返回用户的appdata路径作为绝对路径,包括用户名并考虑他们使用的操作系统版本.

  • 对于那些好奇的人来说,这不适用于XP,因为appdata不是公认的环境变量.然而,程序文件将起作用. (2认同)

小智 10

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

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

Run Code Online (Sandbox Code Playgroud)


小智 6

也许 Google 的同事们可能会觉得看一看 std::filesystem 很有趣。例如,让我们假设 Windows 10 中的默认临时目录位置和 AppData 目录结构:

#include <filesystem>

auto path = std::filesystem::temp_directory_path()
    .parent_path()
    .parent_path();

path /= "Roaming";

if (!std::filesystem::exists(path))
    std::filesystem::create_directories(path);
Run Code Online (Sandbox Code Playgroud)

在 OP 的情况下,我假设这不能解决问题。在需要 100% 稳健实现的情况下,我确实想提醒大家不要这样做,因为系统配置很容易改变和破坏上述情况。

但也许这个问题的新访问者可能会发现 std::filesystem 很有用。很有可能,如果您正在寻找目录中的项目,您将想要操作它,为此, std::filesystem 可以成为您的朋友。


小智 5

使用此代码读取环境变量“APPDATA”,
在开头包含 stdio.h 文件

char *pValue;
size_t len;
errno_t err = _dupenv_s(&pValue, &len, "APPDATA");
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述