2010-10-18 6 views

Antwort

11

Verwenden Sie SHGetSpecialFolderPath mit einem CSIDL auf den gewünschten Ordner (wahrscheinlich CSIDL_APPDATA oder CSIDL_LOCAL_APPDATA) festgelegt. Sie können auch die neueren Funktionen SHGetFolderPath() und SHGetKnownFolderPath() verwenden. Es gibt auch SHGetKnownFolderIDList() und wenn Sie COM mögen, gibt es IKnownFolder::GetPath().

+1

Beachten Sie, dass diese Funktion bereits zweimal ersetzt wurde. Sie können auch die anderen zwei geben (einschließlich der aktuellen und empfohlenen Funktion). – Joey

+0

@Joey - das hatte ich nicht bemerkt. Vielen Dank. – Ferruccio

6

verwenden, wenn ich es richtig erinnere nur

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

Edit: Gerade doppelt geprüft, funktioniert einwandfrei!

+3

Verwenden Sie stattdessen die richtige API, da Umgebungsvariablen unter Windows eher eine Höflichkeit als ein Vertrag sind. Sie sind möglicherweise nicht unter allen Umständen anwesend. "SHGetKnownFolderPath" * gibt Ihnen jedoch jedes Mal den Pfad. – Joey

+0

Aber SHGetKnownFolderPath möglicherweise auch nicht verfügbar. Starke Kekse. –

+0

@Hans: SHGetSpecialFolderPath sollte jedoch sein. Abhängig vom Betriebssystem zielt man ab. – Joey

0

Sie könnten these functions verwenden:

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

Wie so:

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

Verwenden Sie stattdessen die richtige API, da Umgebungsvariablen unter Windows eher eine Höflichkeit als ein Vertrag sind. Sie sind möglicherweise nicht unter allen Umständen anwesend. "SHGetKnownFolderPath" * gibt Ihnen jedoch jedes Mal den Pfad. – Joey

+3

Es ist nützlich, Umgebungsvariablen pro Prozess zu überschreiben. Warum sagen Sie, dass sie "mehr eine Höflichkeit als ein Vertrag" sind?Gibt es dazu offizielle oder quasi offizielle Dokumente? –

3

die Variable %APPDATA%-Umgebung wird wahrscheinlich die meiste Zeit arbeiten. Wenn Sie jedoch die offizielle Windows-Methode verwenden möchten, verwenden Sie die SHGetFolderPath function und übergeben Sie den CSIDL-Wert CSIDL_APPDATA oder CSIDL_LOCAL_APPDATA, je nach Ihren Anforderungen.

Dies ist, was die Environment.GetFolderPath()-Methode in .NET verwendet.

EDIT: Joey weist richtig darauf hin, dass dies von SHGetKnownFolderPath in Windows Vista ersetzt wurde. Nachrichten an mich :-).

0

Beispielcode:

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 = Benutzername \ Anwendungsdaten. Im Fenster 10: Benutzername \ AppData \ Roaming

CSIDL_FLAG_CREATE = mit CSIDL_ Wert kombiniert Ordnererstellung in SHGetFolderPath zu zwingen()

Sie können auch verwenden:

CSIDL_LOCAL_APPDATA = Benutzername \ Lokale Einstellungen \ Anwendungsdaten (nicht Roaming)