2010-10-18 10 views

Répondre

11

Utilisez SHGetSpecialFolderPath avec un CSIDL défini dans le dossier souhaité (probablement CSIDL_APPDATA ou CSIDL_LOCAL_APPDATA). Vous pouvez également utiliser les fonctions SHGetFolderPath() et SHGetKnownFolderPath() plus récentes. Il y a aussi SHGetKnownFolderIDList() et si vous aimez COM il y a IKnownFolder::GetPath().

+1

Notez que cette fonction a déjà été remplacée deux fois. Vous pourriez aussi bien donner les deux autres (y compris la fonction actuelle et recommandée). – Joey

+0

@Joey - Je n'avais pas réalisé cela. Merci. – Ferruccio

6

Si je me souviens bien, il devrait juste être

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

Edit: Il suffit de double contrôle, fonctionne très bien!

+3

Utilisez plutôt l'API appropriée, car les variables d'environnement sous Windows sont plus une courtoisie qu'un contrat. Ils pourraient ne pas être présents dans toutes les circonstances. Cependant, 'SHGetKnownFolderPath' * vous donnera le chemin à chaque fois. – Joey

+0

Mais SHGetKnownFolderPath n'est peut-être pas disponible. Biscuits durs. –

+0

@Hans: SHGetSpecialFolderPath devrait être, cependant. En fonction du système d'exploitation cible. – Joey

0

Vous pouvez utiliser these functions:

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

comme ceci:

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

Utilisez plutôt l'API appropriée, car les variables d'environnement sous Windows sont plus une courtoisie qu'un contrat. Ils pourraient ne pas être présents dans toutes les circonstances. Cependant, 'SHGetKnownFolderPath' * vous donnera le chemin à chaque fois. – Joey

+3

Il est utile de pouvoir remplacer les variables d'environnement par processus. Pourquoi dites-vous qu'ils sont "plus une courtoisie qu'un contrat"?Existe-t-il une documentation officielle ou quasi-officielle à cet effet? –

3

En utilisant la variable d'environnement %APPDATA% ne fonctionnera probablement la plupart du temps. Toutefois, si vous voulez le faire de la manière officielle de Windows, vous devez utiliser le SHGetFolderPath function, en passant la valeur CSIDL CSIDL_APPDATA ou CSIDL_LOCAL_APPDATA, en fonction de vos besoins.

C'est ce que la méthode Environment.GetFolderPath() utilise dans .NET.

EDIT: Joey indique correctement que cela a été remplacé par SHGetKnownFolderPath dans Windows Vista. Nouvelles à moi :-).

0

Exemple de code:

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 = nom d'utilisateur \ Application Data. Dans la fenêtre 10 est: nom d'utilisateur \ AppData \ Roaming

CSIDL_FLAG_CREATE = combiner avec une valeur CSIDL_ pour forcer la création de dossier dans SHGetFolderPath()

Vous pouvez également utiliser:

CSIDL_LOCAL_APPDATA = nom d'utilisateur \ Local Settings \ Application Data (non itinérant)

Questions connexes