在Delphi中访问LocalApplicationData当量 [英] Accessing LocalApplicationData Equivalent in Delphi

查看:154
本文介绍了在Delphi中访问LocalApplicationData当量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用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
    数据
    目录



这是一个快速的功能,在给出符号名称时将返回相应的特殊文件夹路径。确保您在USES语句中包含SHLOBJ.DCU单元,并使用以下内容:

 函数GetSpecialFolderPath(Folder:Integer; CanCreate:Boolean):string; 

//获取特殊系统文件夹的路径
//
//调用此例程如下:
// GetSpecialFolderPath(CSIDL_PERSONAL,false)
//返回文件夹作为结果
//
var
FilePath:array [0..255] of char;

begin
SHGetSpecialFolderPath(0,@FilePath [0],FOLDER,CanCreate);
结果:= FilePath;
结束

=================== $ / $ $ $ $
$ b

为了参考,常量如下:

  CSIDL_DESKTOP = $ 0000; {< desktop> } 
CSIDL_INTERNET = $ 0001; {Internet Explorer(桌面上的图标)}
CSIDL_PROGRAMS = $ 0002; {开始菜单\Programs}
CSIDL_CONTROLS = $ 0003; {我的电脑\\控制面板}
CSIDL_PRINTERS = $ 0004; {我的电脑\打印机}
CSIDL_PERSONAL = $ 0005; { 我的文件。这相当于XP及以上的CSIDL_MYDOCUMENTS}
CSIDL_FAVORITES = $ 0006; {< user name> \Favorites}
CSIDL_STARTUP = $ 0007; {开始菜单\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; {逻辑我的文档桌面图标}
CSIDL_MYMUSIC = $ 000d; {我的音乐文件夹}
CSIDL_MYVIDEO = $ 000e; {我的视频文件夹}
CSIDL_DESKTOPDIRECTORY = $ 0010; {< user name> \Desktop}
CSIDL_DRIVES = $ 0011; {我的电脑}
CSIDL_NETWORK = $ 0012; {网络邻居(我的网络位置)}
CSIDL_NETHOOD = $ 0013; {< user name> \\\
ethood}
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; {所有用户\\应用数据}
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系统目录在RISC上}
CSIDL_PROGRAM_FILESX86 = $ 002a; {x86 C:\程序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; {网络和拨号连接}
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; {资源目录}
CSIDL_RESOURCES_LOCALIZED = $ 0039; {Localized Resource Directory}
CSIDL_COMMON_OEM_LINKS = $ 003a; {链接到所有用户OEM特定应用程序}
CSIDL_CDBURN_AREA = $ 003b; {USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning}
CSIDL_COMPUTERSNEARME = $ 003d; {Computer Near Me(计算机工作组成员资格)}
CSIDL_PROFILES = $ 003e;


Using Delphi, how do I access the equivalent of .NET's System.Environment.SpecialFolder.LocalApplicationData variable (which works on any version of Windows)? I assumed I could just do:

dir := GetEnvironmentVariable('LOCALAPPDATA');

This works on Vista but XP doesn't seem to set that environment variable by default at least on my test machine.

解决方案

In Delphi, the special system folder path constants are defined in ShlObj.DCU, and are referenced in the form of CSIDL_ followed by a symbolic name. Example:

  • CSIDL_DESKTOPDIRECTORY returns the path to the current desktop
  • CSIDL_PERSONAL is the My Documents directory
  • CSIDL___LOCAL_APPDATA is the (user name)\Local Settings\Application Data directory

Here's a quick function that will return the appropriate special folder path when given the symbolic name. Make sure you include the SHLOBJ.DCU unit in your USES statement, and use the following:

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;

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

For reference, the constants are as follows:

  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;

这篇关于在Delphi中访问LocalApplicationData当量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆