使用Delphi,我如何访问相当于.NET的System.Environment.SpecialFolder.LocalApplicationData变量(适用于任何版本的Windows)?我以为我可以做到:
dir := GetEnvironmentVariable('LOCALAPPDATA');
这适用于Vista,但默认情况下XP至少在我的测试机上没有设置该环境变量.
在Delphi中,特殊系统文件夹路径常量在ShlObj.DCU中定义,并以CSIDL_的形式引用,后跟符号名称.例:
CSIDL_DESKTOPDIRECTORY返回当前桌面的路径
CSIDL_PERSONAL是我的文档目录
CSIDL___LOCAL_APPDATA是 (用户名)\ Local Settings\Application Data目录
这是一个快速函数,在给定符号名称时将返回相应的特殊文件夹路径.确保在USES语句中包含SHLOBJ.DCU单元,并使用以下命令:
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;
================================================== ==============
作为参考,常量如下:
CSIDL_DESKTOP = $0000; {} 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; { \Favorites } CSIDL_STARTUP = $0007; { Start Menu\Programs\Startup } CSIDL_RECENT = $0008; { \Recent } CSIDL_SENDTO = $0009; { \SendTo } CSIDL_BITBUCKET = $000a; { \Recycle Bin } CSIDL_STARTMENU = $000b; { \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; { \Desktop } CSIDL_DRIVES = $0011; { My Computer } CSIDL_NETWORK = $0012; { Network Neighborhood (My Network Places) } CSIDL_NETHOOD = $0013; { \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; { \Application Data } CSIDL_PRINTHOOD = $001b; { \PrintHood } CSIDL_LOCAL_APPDATA = $001c; { \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; { \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;