2012-12-05 73 views
2

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

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

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

编辑

至于Windows用户会话,这是为了对任何Windows会话的全局位置,而这个应用程序实际上是将在会话0

+0

你知道,你在这个用例中的应用程序 - 没有安装 - 需要管理员权限? –

+1

我从来没有见过从CD运行的服务。你如何开始? –

+0

@UweRaabe它可以编译为服务和Windows应用程序,它可以以任何方式运行。 –

回答

5

参考运行服务MSDN CSIDL listing并使用SHGetFolderPath() function

将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()。

+1

的安全性,最初需要授予'CSIDL_COMMON_APPDATA \ '修改权限。 – kobik

+0

@kobik:好点。 –

2

既然你正在谈论的临时数据,最明显的路径将是Windows临时目录:

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

请务必让你的文件打开,只要应用程序是活动的,所以用户可以每当他决定清理临时目录时,都不会删除文件。

+0

这是我的第一个想法,但我打算即使在重新启动计算机时也要保留这些文件。 –

+1

但这只是用户临时文件夹,只有该用户可以读取/写入数据。任何实例不限于只有一个用户...也许这个问题不明确这 –

+1

@JerryDodge当重新启动时,如果你没有删除它们,临时文件夹的内容会保留在原地......最新问题 –

相关问题