我应该在哪里保存一个半临时数据库?

时间:2012-12-05 00:51:58

标签: database delphi directory temporary

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

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

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

修改

就Windows用户会话而言,这是一个适用于任何Windows会话的全局位置,此应用程序实际上是一个将在会话0中运行的服务。

2 个答案:

答案 0 :(得分:5)

请参阅MSDN CSIDL listing并使用SHGetFolderPath() function

将CSIDL CSIDL_COMMON_APPDATA映射到物理目录。

来自MSDN:

  

包含所有应用程序数据的文件系统目录   用户。典型的路径是C:\ Documents and Settings \ All   用户\应用程序数据。此文件夹用于应用程序数据   不是用户特定的。例如,应用程序可以存储   拼写检查字典,剪贴画数据库或者日志文件   CSIDL_COMMON_APPDATA文件夹。这些信息不会漫游而已   任何使用电脑的人都可以使用。

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

注意:请勿使用CSIDL_COMMON_DOCUMENTS / FOLDERID_PublicDocuments。这适用于可在不同应用程序之间共享的类文档文件。对于专有数据,如数据库,请使用CSIDL_COMMON_APPDATA。 CSIDL_COMMON_DOCUMENTS中的文件也可能被操作系统“漫游” - 你肯定不希望用于临时数据库。

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

答案 1 :(得分:2)

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

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

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