How to get the %AppData% folder in C?
Asked Answered
C

5

9

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

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

Consideration answered 18/10, 2010 at 23:0 Comment(0)
W
15

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().

Watertight answered 18/10, 2010 at 23:4 Comment(2)
Note that this function was superseded twice already. You might as well give the other two (including the current and recommended function).Inspector
@Inspector - I had not realized that. Thanks.Watertight
I
7

If I recall correctly it should just be

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

Edit: Just double-checked, works fine!

Inhabit answered 18/10, 2010 at 23:3 Comment(3)
Use the proper API instead, as environment variables on Windows are more a courtesy than a contract. They might not be present under all circumstances. However, SHGetKnownFolderPath will give you the path every time.Inspector
But SHGetKnownFolderPath might not be available either. Tough cookies.Volar
@Hans: SHGetSpecialFolderPath should be, though. Depending on the OS one targets.Inspector
B
4

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 :-).

Bimolecular answered 18/10, 2010 at 23:7 Comment(0)
S
1

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);
Semantic answered 18/10, 2010 at 23:4 Comment(2)
Use the proper API instead, as environment variables on Windows are more a courtesy than a contract. They might not be present under all circumstances. However, SHGetKnownFolderPath will give you the path every time.Inspector
It's useful to be able to override environment variables on a per-process basis. Why do you say they are "more a courtesy than a contract"? Is there some official or quasi-official documentation to this effect?Menedez
D
1

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)

Dioecious answered 17/10, 2016 at 15:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.