我的应用程序正在将设置存储在当前用户configuration文件(在WinXP下的C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.ini
下的INI文件中。 但是我意识到这些设置中的一些对于机器来说是独特的,而不是用户,因此想要(实际上需要)将它们保存在所有用户的单个位置。
Windows XP(和更高版本)上是否存在文件夹位置,可以存储用户独立设置?
注意:我不想将它们存储在与我的应用程序相同的文件夹中,也不希望将它们存储在registry中。
我注意到“C:\ Documents and Settings \”下有一个“All Users”文件夹? 我应该在那里存储?
奖励积分:我更倾向于给予谁可以告诉我如何在Delphi 7中从Windows返回这个path的答案。
对于XP,Windows提供了SHGetFolderPath()来获取已知位置。 您要查找的CSIDL是CSIDL_COMMON_APPDATA
,描述如下:
包含所有用户的应用程序数据的文件系统目录。 典型的路径是
"C:\Documents and Settings\All Users\Application Data"
。 此文件夹用于不是用户特定的应用程序数据。 例如,应用程序可以将拼写检查字典,剪贴画数据库或日志文件存储在CSIDL_COMMON_APPDATA
文件夹中。 这些信息不会漫游,任何人都可以使用电脑。
对于Vista和更高版本,这已被替换为SHGetKnownFolderPath(),尽管SHGetFolderPath()仍然可用作包装函数。 如果您使用真正的Vista调用,则应该使用FOLDERID_ProgramData
而不是CSIDL_COMMON_APPDATA
。
这里的链接似乎表明了一种做法。
这似乎归结于此(谨慎对待此事,我不知道德尔福那么好):
function ShGetKnownFolderPath ( const rfid: TGUID; dwFlags: DWord; hToken: THandle; out ppszPath: PWideChar): HResult; var Shell: Hmodulee; Fn: TShGetKnownFolderPath; begin Shell := LoadLibrary ('shell32.dll'); Win32Check(Shell <> 0); try @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath'); Win32Check (Assigned (Fn)); Result := Fn (rfid, dwFlags, hToken, ppszPath); finally FreeLibrary (Shell); end; end;
function GetKnownFolderPath ( const rfid: TGUID; dwFlags: DWord; hToken: THandle): WideString; var buffer: PWideChar; ret: HResult; begin ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer); OleCheck (ret); try Result := buffer; finally CoTaskMemFree (buffer); end; end;
此页面提供了所有CSIDL_*
和FOLDERID_*
值的列表。 请记住,您应该将这些函数用于您的用户特定数据,而不是硬编码的值,如"C:\Documents and Settings\<CurrentUser>\Application Data\"
。 Windows的不同语言版本可能使用不同的目录名称,或者用户可以自由移动数据区域。
我建议使用开源的JEDI代码库来处理这种事情。
在JclShell.pas中,你会发现GetSpecialFolderLocation()
YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA);
它是免费的,经过充分测试,适用于所有的Windows版本,使用它将使您免受未来对Windows API的影响。