2010-10-18 21 views

Respuesta

11

Utilice SHGetSpecialFolderPath con un CSIDL en la carpeta deseada (probablemente CSIDL_APPDATA o CSIDL_LOCAL_APPDATA).

También puede usar las funciones más nuevas SHGetFolderPath() y SHGetKnownFolderPath(). También hay SHGetKnownFolderIDList() y si te gusta COM hay IKnownFolder::GetPath().

+1

Tenga en cuenta que esta función ya fue reemplazada dos veces. También podría dar los otros dos (incluida la función actual y recomendada). – Joey

+0

@Joey - No me había dado cuenta de eso. Gracias. – Ferruccio

6

Si no recuerdo mal sólo debe ser

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

Editar: Sólo una doble comprobación, funciona bien!

+3

Use la API correcta en su lugar, ya que las variables de entorno en Windows son más una cortesía que un contrato. Es posible que no estén presentes en todas las circunstancias. Sin embargo, 'SHGetKnownFolderPath' * * le dará la ruta cada vez. – Joey

+0

Pero SHGetKnownFolderPath podría no estar disponible tampoco. Galletas resistentes –

+0

@Hans: SHGetSpecialFolderPath debería ser, sin embargo. Dependiendo del sistema operativo, un objetivo. – Joey

0

Es posible utilizar these functions:

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

así:

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

Use la API adecuada en su lugar, ya que las variables de entorno en Windows son más una cortesía que un contrato. Es posible que no estén presentes en todas las circunstancias. Sin embargo, 'SHGetKnownFolderPath' * * le dará la ruta cada vez. – Joey

+3

Es útil para anular variables de entorno por proceso. ¿Por qué dices que son "más una cortesía que un contrato"?¿Hay alguna documentación oficial o cuasi oficial para este efecto? –

3

El uso de la variable de entorno %APPDATA% probablemente trabajar la mayor parte del tiempo. Sin embargo, si desea hacer esto de la manera oficial de Windows, debe usar el SHGetFolderPath function, pasando el valor CSIDL CSIDL_APPDATA o CSIDL_LOCAL_APPDATA, dependiendo de sus necesidades.

Esto es lo que el método Environment.GetFolderPath() está utilizando en .NET.

EDIT: Joey señala correctamente que esto ha sido reemplazado por SHGetKnownFolderPath en Windows Vista. Noticias para mí :-).

0

Código de ejemplo:

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 = nombre de usuario \ Datos de programa. En la ventana 10 es: nombre de usuario \ AppData \ Roaming

CSIDL_FLAG_CREATE = combinan con valor CSIDL_ para forzar la creación de carpetas en SHGetFolderPath()

También puede utilizar:

CSIDL_LOCAL_APPDATA = nombre de usuario \ Configuración local \ Datos de programa (no itinerancia)

Cuestiones relacionadas