Romulus
Romulus

Reputation: 579

How to get the %AppData% folder in C?

As above, how do I get the AppData folder in Windows using C?

I know that for C# you use Environment.SpecialFolder.ApplicationData

Upvotes: 9

Views: 22868

Answers (5)

Ferruccio
Ferruccio

Reputation: 100748

Use SHGetSpecialFolderPath with a CSIDL set to the desired folder (probably CSIDL_APPDATA or CSIDL_LOCAL_APPDATA).

You can also use the newer SHGetFolderPath() and SHGetKnownFolderPath() functions. There's also SHGetKnownFolderIDList() and if you like COM there's IKnownFolder::GetPath().

Upvotes: 15

Thiago Falcao
Thiago Falcao

Reputation: 5043

Sample code from 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 = username\Application Data. In Window 10 is: username\AppData\Roaming

CSIDL_FLAG_CREATE = combine with CSIDL_ value to force folder creation in SHGetFolderPath()

You can also use:

CSIDL_LOCAL_APPDATA = username\Local Settings\Application Data (non roaming)

Upvotes: 1

Matt Solnit
Matt Solnit

Reputation: 33572

Using the %APPDATA% environment variable will probably work most of the time. However, if you want to do this the official Windows way, you should use use the SHGetFolderPath function, passing the CSIDL value CSIDL_APPDATA or CSIDL_LOCAL_APPDATA, depending on your needs.

This is what the Environment.GetFolderPath() method is using in .NET.

EDIT: Joey correctly points out that this has been replaced by SHGetKnownFolderPath in Windows Vista. News to me :-).

Upvotes: 4

Matt Joiner
Matt Joiner

Reputation: 118710

You might use these functions:

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

Like so:

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

Upvotes: 1

Mr. Llama
Mr. Llama

Reputation: 20909

If I recall correctly it should just be

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

Edit: Just double-checked, works fine!

Upvotes: 7

Related Questions