Как получить папку% AppData% в C? - PullRequest
8 голосов
/ 19 октября 2010

Как и выше, как мне получить папку AppData в Windows, используя C?

Я знаю, что для C # вы используете Environment.SpecialFolder.ApplicationData

Ответы [ 5 ]

12 голосов
/ 19 октября 2010

Используйте SHGetSpecialFolderPath с CSIDL , установленным в нужную папку (возможно, CSIDL_APPDATA или CSIDL_LOCAL_APPDATA).

Вы также можете использовать более новую SHGetFolderPath ()Функции и SHGetKnownFolderPath () .Также есть SHGetKnownFolderIDList () , и если вам нравится COM, есть IKnownFolder :: GetPath () .

7 голосов
/ 19 октября 2010

Если я правильно помню, это должно быть просто

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

Редактировать: просто дважды проверил, отлично работает!

4 голосов
/ 19 октября 2010

Использование переменной окружения %APPDATA%, вероятно, будет работать большую часть времени. Однако, если вы хотите сделать это официальным способом Windows, вы должны использовать функцию SHGetFolderPath , передавая значение CSIDL CSIDL_APPDATA или CSIDL_LOCAL_APPDATA, в зависимости от ваших потребностей.

Это то, что метод Environment.GetFolderPath() использует в .NET.

РЕДАКТИРОВАТЬ: Джои правильно указывает, что это было заменено на SHGetKnownFolderPath в Windows Vista. Новости для меня: -).

1 голос
/ 19 октября 2010

Вы можете использовать эти функции :

#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);
0 голосов
/ 17 октября 2016

Пример кода:

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 = имя пользователя \ Данные приложения. В окне 10 есть: имя пользователя \ AppData \ Roaming

CSIDL_FLAG_CREATE = в сочетании со значением CSIDL_ для принудительного создания папки в SHGetFolderPath ()

Вы также можете использовать:

CSIDL_LOCAL_APPDATA = имя пользователя \ Локальные настройки \ Данные приложения (без роуминга)

...