Accesso a LocalApplicationData equivalente in Delphi
-
19-08-2019 - |
Domanda
Usando Delphi, come posso accedere all'equivalente della variabile System.Environment.SpecialFolder.LocalApplicationData di .NET (che funziona su qualsiasi versione di Windows)? Supponevo di poter semplicemente fare:
dir := GetEnvironmentVariable('LOCALAPPDATA');
Funziona su Vista ma XP non sembra impostare quella variabile d'ambiente di default almeno sulla mia macchina di prova.
Soluzione
In Delphi, le costanti del percorso della cartella di sistema speciale sono definite in ShlObj.DCU e sono referenziate sotto forma di CSIDL_ seguite da un nome simbolico. Esempio:
- CSIDL_DESKTOPDIRECTORY restituisce il file percorso al desktop corrente
- CSIDL_PERSONAL è la directory Documenti
- CSIDL___LOCAL_APPDATA è (nome utente) \ Impostazioni locali \ Applicazione Dati directory
Ecco una funzione rapida che restituirà il percorso della cartella speciale appropriata quando viene dato il nome simbolico. Assicurarsi di includere l'unità SHLOBJ.DCU nell'istruzione USES e utilizzare quanto segue:
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;
=============================================== =================
Per riferimento, le costanti sono le seguenti:
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;
Altri suggerimenti
Vedi questo articolo .
Modifica
Come aggiunto nel commento di stukelly ci sono molte più informazioni disponibili sulla funzionalità SHGetFolderPath (). Delphi VCL dovrebbe davvero avere funzionalità per ottenere percorsi standard, e se Embarcadero avrà davvero un altro strumento simile a Delphi su un altro sistema operativo, questo sarà tanto più importante. Per un'implementazione multipiattaforma di percorsi standard di sistema, consultare anche la documentazione di wxStandardPaths in wxWidgets . Su MSW utilizza le varie costanti CSIDL_XXX .
Supponendo che tu possa effettuare chiamate WinAPI da Delphi (quale ISTR puoi), eri abituato a farlo con una chiamata API (qualcosa come GetSystemFolder o GetUserDataFolder). È passato un po 'di tempo da quando ho dovuto farlo, ma penso che ora puoi farlo con SHGetFolderPath , passando CSIDL_LOCAL_APPDATA.