2

我有一个应用程序,我想将一些原始文件保存在客户端计算机上的文件夹结构中。此 EXE 是完全独立的,可能从 CD 运行,或者从只读位置运行。因此,我无法将数据保存在 EXE 位置。我想基本上“询问”Windows 我应该将文件保存在哪里,或者将它们保存在正确的位置。

我应该将这些数据永久保存在客户端计算机上的什么位置,但又应该保存在应用程序通常存储其数据的位置?由于此应用程序没有安装程序,因此我不知道某些程序数据文件夹的权限将如何发挥作用。我需要一个为我的应用程序生成公共路径的示例。在同一台机器上运行的任何应用程序实例都应该知道在这个专用位置查找此数据。

PS - 我的意思是半临时数据库,因为该数据库预计会在很长一段时间内保持完整,但是有可能它可能会被删除以进行清理,在这种情况下它会自动创建一个新数据库。数据本身可以被视为某种缓存。

编辑

就 windows 用户会话而言,这旨在成为任何 windows 会话的全局位置,并且此应用程序实际上是一个将在会话 0 中运行的服务。

4

2 回答 2

5

请参阅MSDN CSIDL 列表并使用SHGetFolderPath() 函数

将 CSIDL CSIDL_COMMON_APPDATA 映射到物理目录。

来自 MSDN:

包含所有用户的应用程序数据的文件系统目录。典型路径是 C:\Documents and Settings\All Users\Application Data。此文件夹用于存储非用户特定的应用程序数据。例如,应用程序可以在 CSIDL_COMMON_APPDATA 文件夹中存储拼写检查字典、剪贴画数据库或日志文件。此信息不会漫游,任何使用计算机的人都可以使用。

在此目录下,创建一个以供应商(您的公司)命名的目录,并在该目录下为您的应用程序创建一个目录。然后把你的数据库放在那里。

注意:不要使用 CSIDL_COMMON_DOCUMENTS/FOLDERID_PublicDocuments。这适用于可以在不同应用程序之间共享的类似文档的文件。对于专有数据,如数据库,使用 CSIDL_COMMON_APPDATA 。此外,CSIDL_COMMON_DOCUMENTS 中的文件可能会被操作系统“漫游”——对于临时数据库,您绝对不希望这样做。

注意:对于 Vista 及以上版本,请使用SHGetKnownFolderPath(),但对于 XP 或跨版本,请使用 SHGetFolderPath()。

于 2012-12-05T01:20:06.820 回答
2

由于您在谈论临时数据,因此最明显的路径是 windows 临时目录:

function GetTempDirectory: String;
var
  TempFolder: array[0..MAX_PATH] of Char;
begin
  GetTempPathW(MAX_PATH, @TempFolder);
  Result := TempFolder;
end;

只要应用程序处于活动状态,请确保您的文件保持打开状态,以便用户在决定清理临时目录时无法删除您的文件。

于 2012-12-05T13:30:34.967 回答