5

我的应用程序当前将设置存储在当前用户配置文件(C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.ini在 WinXP 下)下的 INI 文件中。但我已经意识到其中一些设置是机器独有的,而不是用户独有的,因此希望(实际上需要)将它们保存在一个位置供所有用户使用。

Windows XP(及更高版本)上是否有可以存储用户独立设置的文件夹位置?

注意:我不想将它们存储在与我的应用程序相同的文件夹中,也不想将它们存储在注册表中。

我注意到“C:\Documents and Settings\”下有一个“所有用户”文件夹?我应该存放在下面吗?

奖励积分:我更有可能将答案奖励给谁也可以告诉我如何在 Delphi 7 中从 Windows 返回此路径。

4

2 回答 2

12

对于 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.

这里的这个链接似乎显示了一种方法。

似乎可以归结为这一点(谨慎对待,我不太了解 Delphi):

function ShGetKnownFolderPath (
    const rfid:   TGUID;
    dwFlags:      DWord;
    hToken:       THandle;
    out ppszPath: PWideChar): HResult;
var
    Shell: HModule;
    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 使用不同的目录名称,或者用户可以自由移动他们的数据区域。

于 2009-08-11T02:12:01.563 回答
6

对于这类事情,我建议使用开源JEDI 代码库。

在 JclShell.pas 你会发现 GetSpecialFolderLocation()

YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA);

它是免费的,经过良好测试,适用于所有 Windows 版本,使用它将使您免受未来对 Windows API 的更改。

于 2009-08-31T21:32:18.043 回答