【问题标题】:How to get a permanent directory from Windows for storing cached thumbnail images?如何从 Windows 获取用于存储缓存缩略图的永久目录?
【发布时间】:2012-01-22 00:17:12
【问题描述】:

我正在构建一个图像缩略图缓存系统,我需要它做的主要事情之一就是向 Windows 询问存储我的永久缓存文件的最佳位置。我见过很多获取临时目录的好方法,但我需要一个永久缓存位置。如何从 Windows 中获取此信息?

注意

该系统实际上将作为在后台运行的 Windows 服务(或线程)运行 - 以及从该缓存读取的许多应用程序。它需要在全局级别上,而不是每个 Windows 用户。

【问题讨论】:

  • 本地应用数据路径? FOLDERID_LocalAppData
  • 好的来源顺便说一句,我正在寻找是否有一个不是特定于用户的,因为它将是全球性的......
  • @AndreasRejbrand 等等,那个链接说这些与 Vista 及更高版本兼容 - 它是否可以在 XP 中运行?
  • 否,为了兼容 XP,您需要改用旧的 CSIDL classification。这也适用于 Vista 和 7,因此除非您故意只针对 Vista+,否则请使用它。
  • 我认为将数据存储在 Program Files 文件夹中是不合适的。 CSIDL_COMMON_APPDATA 更好。

标签: delphi winapi caching delphi-7 delphi-xe2


【解决方案1】:

首先,您需要找出存储数据的位置。在 MSDN 是旧 CSIDL 常量的list。要从 CSIDL 常量获取路径,请使用 SHGetFolderPath 函数,如下所示 (uses ShFolder):

procedure TForm1.Button1Click(Sender: TObject);
var
  path: array[0..MAX_PATH] of char;
begin
  SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
  ShowMessage(path);
end;

【讨论】:

  • CSIDL_COMMON_APPDATA 需要标准用户的写入权限。如果标准用户将修改缓存文件,您可能会考虑使用 CSIDL_COMMON_DOCUMENTS。
  • CSIDL_COMMON_DOCUMENTS 的 +1。这是我放置“全球”内容的地方。通常,我使用 EXE 名称在那里创建一个文件夹。
  • 嗯,我不太喜欢这个主意。在我的世界中,通用文档文件夹(以及每个用户的文档文件夹)是用户负责的文件夹。就个人而言,当软件将内容添加到我的文档文件夹时,我总是会“生气”。那是我的个人文件夹! (而且,实际上,图像缓存文件不是“文档”,尤其是对用户而言。)
  • @Andreas,我听到了,但你别无选择。我相信 MS 扭曲了关于 CSIDL_COMMON_APPDATA 的整个概念。如果您希望所有用户都能够修改该文件夹 (CSIDL_COMMON_APPDATA\My Company\My App) 中的数据,您需要将 modify 权限隐式添加到 Users 组(在您的安装程序中)。我已经看到许多已知的应用程序根据用户将自身安装到“我的文档”中,并为启用 UAC 的操作系统中的所有用户安装“我的共享文档”。
  • @Andreas,您的建议“本地应用程序数据”(CSIDL_LOCAL_APPDATA) 也是我存储缓存文件的选择。但由于那个 OP 接受了CSIDL_COMMON_APPDATA,我建议CSIDL_COMMON_DOCUMENTS 作为替代方案。
【解决方案2】:

GetEnvironmentVariable(PATH_NAME)

PATH_NAME 可以是系统名称(WINDIR、TEMP、TMP 等),但也可以是用户定义的路径

【讨论】:

  • 没有符合要求的标准环境变量。
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 2014-05-05
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2012-09-09
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多