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

时间:2011-05-07 11:54:30

标签: c++ appdata

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

 C:\Users\*Username*\AppData\Roaming
在Windows 7上

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

5 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:17)

您可以尝试以下操作:

char* appdata = getenv("APPDATA");

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

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

答案 2 :(得分:2)

也许其他的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);

对于OP,我假设这不能解决问题。 我确实想提醒您在需要100%可靠实施的情况下执行上述操作,因为系统配置可以轻松更改并破坏以上操作。

但是也许这个问题的新访问者可能会发现std :: filesystem有用。很有可能,如果您要查找目录中的项目,则可能要对其进行操作,为此,std :: filesystem可以成为您的朋友。

答案 3 :(得分:1)

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

char *pValue;
size_t len;
errno_t err = _dupenv_s(&pValue, &len, "APPDATA");
enter image description here

答案 4 :(得分:1)

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

#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://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderpath
     * https://docs.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;
}