如何在C语言中获取%AppData%文件夹?

9

如上所述,我该如何使用C语言在Windows中获取AppData文件夹?

我知道在C#中可以使用Environment.SpecialFolder.ApplicationData

5个回答

15

3
请注意,此函数已被两次取代。您可以考虑使用另外两个(包括当前和推荐的函数)。 - Joey
@Joey - 我之前没有意识到这一点。谢谢。 - Ferruccio

7
如果我没记错的话,应该只是这样。
#include <stdlib.h>
getenv("APPDATA");

编辑:刚刚核对过,运行正常!


3
请使用正确的API,因为在Windows环境下,环境变量更多地是一种礼貌而非契约。它们可能在某些情况下不存在。然而,SHGetKnownFolderPath将始终为您提供路径。 - Joey
但是SHGetKnownFolderPath也可能不可用。没办法。 - Hans Passant
@Hans:SHGetSpecialFolderPath 应该是可以的,取决于目标操作系统。 - Joey

4
使用%APPDATA%环境变量通常会起到作用。但是,如果您想按照官方的Windows方式进行操作,您应该使用SHGetFolderPath函数,传递CSIDL_APPDATACSIDL_LOCAL_APPDATA的值,具体取决于您的需求。
这就是.NET中Environment.GetFolderPath()方法所使用的内容。 编辑: Joey正确指出,在Windows Vista中,这已被SHGetKnownFolderPath所替代。这对我来说是个好消息 :-)。

1

来自MSDN的示例代码:

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 = 用户名\Application Data。在Windows 10中为:用户名\AppData\Roaming

CSIDL_FLAG_CREATE = 与CSIDL_值结合使用,以在SHGetFolderPath()中强制创建文件夹

您还可以使用:

CSIDL_LOCAL_APPDATA = 用户名\Local Settings\Application Data(非漫游)


1

您可以使用这些函数

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

3
请使用正确的API,因为Windows环境变量更多是一种礼貌而不是契约。在某些情况下,它们可能不存在。但是SHGetKnownFolderPath每次都会给您路径。 - Joey
3
能够按进程覆盖环境变量非常有用。您为什么说它们“更像是礼貌而不是契约”?是否有一些官方或准官方的文件可以证实这一点? - Integer Poet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接