2009-01-22 19 views
7

Usando Delphi, ¿cómo accedo al equivalente de .NET's System.Environment.SpecialFolder.LocalApplicationData variable (que funciona en cualquier versión de Windows)? Supuse que sólo podía hacer:Acceso a Equivalente de LocalApplicationData en Delphi

dir := GetEnvironmentVariable('LOCALAPPDATA'); 

Esto funciona en Vista, pero XP no parece establecer que la variable de entorno por defecto, al menos en mi máquina de prueba.

+0

Creo que se añadió la variable de entorno LOCALAPPDATA en Windows Vista http://vistaonwindows.com/environment_variables.html – stukelly

Respuesta

18

En Delphi, las constantes de ruta de la carpeta del sistema especial se definen en ShlObj.DCU, y se mencionan en forma de CSIDL_ seguido de un nombre simbólico. Ejemplo:

  • CSIDL_DESKTOPDIRECTORY devuelve la ruta al escritorio actual
  • CSIDL_PERSONAL es la Mis documentos directorio
  • CSIDL___LOCAL_APPDATA es la (nombre de usuario) \ Configuración local \ datos directorio

Aquí hay una función rápida que devolverá el ruta de carpeta especial cuando se le da el nombre simbólico. Asegúrese de incluir la unidad SHLOBJ.DCU en su estado de cuenta utiliza y utilizar lo siguiente:

function GetSpecialFolderPath(Folder: Integer; CanCreate: Boolean): string; 

// Gets path of special system folders 
// 
// Call this routine as follows: 
// GetSpecialFolderPath (CSIDL_PERSONAL, false) 
//  returns folder as result 
// 
var 
    FilePath: array [0..255] of char; 

begin 
SHGetSpecialFolderPath(0, @FilePath[0], FOLDER, CanCreate); 
Result := FilePath; 
end; 

======================== =====================================

Como referencia, las constantes son de la siguiente manera:

CSIDL_DESKTOP      = $0000; { <desktop> } 
    CSIDL_INTERNET      = $0001; { Internet Explorer (icon on desktop) } 
    CSIDL_PROGRAMS      = $0002; { Start Menu\Programs } 
    CSIDL_CONTROLS      = $0003; { My Computer\Control Panel } 
    CSIDL_PRINTERS      = $0004; { My Computer\Printers } 
    CSIDL_PERSONAL      = $0005; { My Documents. This is equivalent to CSIDL_MYDOCUMENTS in XP and above } 
    CSIDL_FAVORITES      = $0006; { <user name>\Favorites } 
    CSIDL_STARTUP      = $0007; { Start Menu\Programs\Startup } 
    CSIDL_RECENT      = $0008; { <user name>\Recent } 
    CSIDL_SENDTO      = $0009; { <user name>\SendTo } 
    CSIDL_BITBUCKET      = $000a; { <desktop>\Recycle Bin } 
    CSIDL_STARTMENU      = $000b; { <user name>\Start Menu } 
    CSIDL_MYDOCUMENTS     = $000c; { logical "My Documents" desktop icon } 
    CSIDL_MYMUSIC      = $000d; { "My Music" folder } 
    CSIDL_MYVIDEO      = $000e; { "My Video" folder } 
    CSIDL_DESKTOPDIRECTORY    = $0010; { <user name>\Desktop } 
    CSIDL_DRIVES      = $0011; { My Computer } 
    CSIDL_NETWORK      = $0012; { Network Neighborhood (My Network Places) } 
    CSIDL_NETHOOD      = $0013; { <user name>\nethood } 
    CSIDL_FONTS       = $0014; { windows\fonts } 
    CSIDL_TEMPLATES      = $0015; 
    CSIDL_COMMON_STARTMENU    = $0016; { All Users\Start Menu } 
    CSIDL_COMMON_PROGRAMS    = $0017; { All Users\Start Menu\Programs } 
    CSIDL_COMMON_STARTUP    = $0018; { All Users\Startup } 
    CSIDL_COMMON_DESKTOPDIRECTORY  = $0019; { All Users\Desktop } 
    CSIDL_APPDATA      = $001a; { <user name>\Application Data } 
    CSIDL_PRINTHOOD      = $001b; { <user name>\PrintHood } 
    CSIDL_LOCAL_APPDATA     = $001c; { <user name>\Local Settings\Application Data (non roaming) } 
    CSIDL_ALTSTARTUP     = $001d; { non localized startup } 
    CSIDL_COMMON_ALTSTARTUP    = $001e; { non localized common startup } 
    CSIDL_COMMON_FAVORITES    = $001f; 
    CSIDL_INTERNET_CACHE    = $0020; 
    CSIDL_COOKIES      = $0021; 
    CSIDL_HISTORY      = $0022; 
    CSIDL_COMMON_APPDATA    = $0023; { All Users\Application Data } 
    CSIDL_WINDOWS      = $0024; { GetWindowsDirectory() } 
    CSIDL_SYSTEM      = $0025; { GetSystemDirectory() } 
    CSIDL_PROGRAM_FILES     = $0026; { C:\Program Files } 
    CSIDL_MYPICTURES     = $0027; { C:\Program Files\My Pictures } 
    CSIDL_PROFILE      = $0028; { USERPROFILE } 
    CSIDL_SYSTEMX86      = $0029; { x86 system directory on RISC } 
    CSIDL_PROGRAM_FILESX86    = $002a; { x86 C:\Program Files on RISC } 
    CSIDL_PROGRAM_FILES_COMMON   = $002b; { C:\Program Files\Common } 
    CSIDL_PROGRAM_FILES_COMMONX86  = $002c; { x86 C:\Program Files\Common on RISC } 
    CSIDL_COMMON_TEMPLATES    = $002d; { All Users\Templates } 
    CSIDL_COMMON_DOCUMENTS    = $002e; { All Users\Documents } 
    CSIDL_COMMON_ADMINTOOLS    = $002f; { All Users\Start Menu\Programs\Administrative Tools } 
    CSIDL_ADMINTOOLS     = $0030; { <user name>\Start Menu\Programs\Administrative Tools } 
    CSIDL_CONNECTIONS     = $0031; { Network and Dial-up Connections } 
    CSIDL_COMMON_MUSIC     = $0035; { All Users\My Music } 
    CSIDL_COMMON_PICTURES    = $0036; { All Users\My Pictures } 
    CSIDL_COMMON_VIDEO     = $0037; { All Users\My Video } 
    CSIDL_RESOURCES      = $0038; { Resource Directory } 
    CSIDL_RESOURCES_LOCALIZED   = $0039; { Localized Resource Directory } 
    CSIDL_COMMON_OEM_LINKS    = $003a; { Links to All Users OEM specific apps } 
    CSIDL_CDBURN_AREA     = $003b; { USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning } 
    CSIDL_COMPUTERSNEARME    = $003d; { Computers Near Me (computered from Workgroup membership) } 
    CSIDL_PROFILES      = $003e; 
+2

1.) La longitud del búfer debe ser MAX_PATH. 2.) Usar SetLength() en Result y usar eso como el buffer elimina la copia de cadena superflua. 3.) Para devolver una cadena de longitud mínima, llame a SetLength (Resultado, StrLen (PChar (Resultado))); – mghie

1

Ver this article.

Editar:

Como se añadió en el comentario de stukelly hay mucha más información disponible acerca de la funcionalidad SHGetFolderPath(). Delphi VCL realmente debería tener funcionalidad para obtener rutas estándar, y si Embarcadero de hecho tendrá otra herramienta similar a Delphi en otro sistema operativo, esto será aún más importante. Para una implementación multiplataforma de rutas estándar del sistema, ver también el documentation of wxStandardPaths en wxWidgets. En MSW esto usa las diversas constantes CSIDL_XXX.

+0

Otro artículo en el mismo sitio, con más detalle. http://delphi.about.com/od/kbwinshell/a/SHGetFolderPath.htm – stukelly

0

Suponiendo que puede realizar llamadas WinAPI desde Delphi (que ISTR puede), solía ser capaz de hacer eso con una llamada API (algo así como GetSystemFolder o GetUserDataFolder). Ha pasado un tiempo desde que tuve que hacerlo, pero creo que ahora puede hacerlo con SHGetFolderPath, pasando CSIDL_LOCAL_APPDATA.

Cuestiones relacionadas