【问题标题】:How to get the %AppData% folder in C?如何在 C 中获取 %AppData% 文件夹?
【发布时间】:2024-07-24 13:05:02
【问题描述】:

如上,如何使用 C 语言获取 Windows 中的 AppData 文件夹?

我知道对于 C#,您使用 Environment.SpecialFolder.ApplicationData

【问题讨论】:

    标签: c windows appdata


    【解决方案1】:

    如果我没记错的话应该是

    #include <stdlib.h>
    getenv("APPDATA");
    

    编辑:仔细检查,工作正常!

    【讨论】:

    • 请改用适当的 API,因为 Windows 上的环境变量与其说是契约,不如说是一种礼貌。它们可能并非在所有情况下都存在。但是,SHGetKnownFolderPath每次都给你路径。
    • 但是 SHGetKnownFolderPath 也可能不可用。硬饼干。
    • @Hans:不过,SHGetSpecialFolderPath 应该是。取决于操作系统一个目标。
    【解决方案2】:

    使用 SHGetSpecialFolderPath 并将 CSIDL 设置为所需的文件夹(可能是 CSIDL_APPDATA 或 CSIDL_LOCAL_APPDATA)。

    您还可以使用较新的 SHGetFolderPath()SHGetKnownFolderPath() 函数。 还有SHGetKnownFolderIDList(),如果你喜欢COM,还有IKnownFolder::GetPath()

    【讨论】:

    • 请注意,此功能已被取代两次。还不如给另外两个(包括当前和推荐的函数)。
    • @Joey - 我没有意识到这一点。谢谢。
    【解决方案3】:

    你可以使用these functions:

    #include <stdlib.h>
    char *getenv( 
       const char *varname 
    );
    wchar_t *_wgetenv( 
       const wchar_t *varname 
    );
    

    像这样:

    #include <stdio.h>
    char *appData = getenv("AppData");
    printf("%s\n", appData);
    

    【讨论】:

    • 请改用适当的 API,因为 Windows 上的环境变量与其说是契约,不如说是一种礼貌。它们可能并非在所有情况下都存在。但是,SHGetKnownFolderPath每次都给你路径。
    • 能够在每个进程的基础上覆盖环境变量非常有用。为什么说他们“比合同更礼貌”?有这方面的官方或准官方文件吗?
    【解决方案4】:

    使用%APPDATA% 环境变量可能大部分时间都有效。但是,如果您想以官方 Windows 方式执行此操作,则应使用 SHGetFolderPath function,传递 CSIDL 值 CSIDL_APPDATACSIDL_LOCAL_APPDATA,具体取决于您的需要。

    这就是 Environment.GetFolderPath() 方法在 .NET 中使用的内容。

    编辑: Joey 正确地指出,在 Windows Vista 中这已被 SHGetKnownFolderPath 取代。给我的消息:-)。

    【讨论】:

      【解决方案5】:

      示例代码:

      TCHAR szPath[MAX_PATH];
      if (SUCCEEDED(SHGetFolderPath(NULL,
         CSIDL_APPDATA | CSIDL_FLAG_CREATE,
         NULL,
         0,
         szPath)))
      {
         PathAppend(szPath, TEXT("MySettings.xml"));
         HANDLE hFile = CreateFile(szPath, ...);
      }
      

      CSIDL_APPDATA = 用户名\应用程序数据。在 Window 10 中是:username\AppData\Roaming

      CSIDL_FLAG_CREATE = 结合 CSIDL_ 值强制在 SHGetFolderPath() 中创建文件夹

      你也可以使用:

      CSIDL_LOCAL_APPDATA = 用户名\本地设置\应用程序数据(非漫游)

      【讨论】: