Question

Avec Delphi, comment accéder à l'équivalent de la variable System.Environment.SpecialFolder.LocalApplicationData de .NET (qui fonctionne sur toutes les versions de Windows)? J'ai supposé que je pouvais faire:

dir := GetEnvironmentVariable('LOCALAPPDATA');

Cela fonctionne sous Vista, mais XP ne semble pas définir cette variable d'environnement par défaut, du moins sur ma machine de test.

Était-ce utile?

La solution

Dans Delphi, les constantes spéciales du chemin d'accès au dossier système sont définies dans ShlObj.DCU et sont référencées sous la forme CSIDL_ suivi d'un nom symbolique. Exemple:

  • CSIDL_DESKTOPDIRECTORY renvoie le chemin vers le bureau actuel
  • CSIDL_PERSONAL est le répertoire Mes documents
  • CSIDL ___ LOCAL_APPDATA est le (nom d'utilisateur) \ Local Settings \ Application Répertoire de données

Voici une fonction rapide qui renvoie le chemin du dossier spécial approprié lorsque le nom symbolique lui est attribué. Assurez-vous d'inclure l'unité SHLOBJ.DCU dans votre instruction USES et utilisez les éléments suivants:

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;

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

Pour référence, les constantes sont les suivantes:

  CSIDL_DESKTOP                       = <*>; { <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                     = <*>a; { <desktop>\Recycle Bin }
  CSIDL_STARTMENU                     = <*>b; { <user name>\Start Menu }
  CSIDL_MYDOCUMENTS                   = <*>c; { logical "My Documents" desktop icon }
  CSIDL_MYMUSIC                       = <*>d; { "My Music" folder }
  CSIDL_MYVIDEO                       = <*>e; { "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;

Autres conseils

Voir cet article .

Modifier:

Comme ajouté dans le commentaire de stukelly, il y a beaucoup plus d'informations disponibles sur la fonctionnalité SHGetFolderPath (). La VCL de Delphi devrait vraiment avoir des fonctionnalités pour obtenir des chemins standard, et si Embarcadero va effectivement avoir un autre outil semblable à Delphi sur un autre système d’exploitation, cela sera d’autant plus important. Pour une implémentation multiplate-forme de chemins système standard, voir aussi la documentation de wxStandardPaths dans wxWidgets . Sous MSW, cela utilise les différentes constantes CSIDL_XXX .

En supposant que vous puissiez passer des appels WinAPI à partir de Delphi (ce que vous pouvez faire avec ISTR), vous pouviez le faire avec un appel API (quelque chose comme GetSystemFolder ou GetUserDataFolder). Cela fait longtemps que je n’ai pas à le faire, mais je pense que vous pouvez maintenant le faire avec SHGetFolderPath , en transmettant CSIDL_LOCAL_APPDATA.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top