7

在我的应用程序中,我在每台机器上都将一些文件存储在应用程序文件夹中。

真实案例的简化版本是这样的:

..\Project1\LoginHistory (login history file - common for all users)
..\Project1\Translations (localization files - common for all users)
..\Project1\FormSettings\User1\ (this contains an ini file per form for User1)
..\Project1\FormSettings\UserN\ (this contains an ini file per form for UserN)

所以你可以看到我为什么使用它:保存一些特定于机器的数据(记住从这台机器进行的最新登录,一种 MRU),存储翻译字符串或 3rd 方组件(这些是从 exe 中提取的运行时资源)并用于保存一些用户特定的数据(如表单大小)。实际情况更复杂,但至少你可以知道有一些“公共文件夹”和一些“用户文件夹”。

现在我想保留这个结构,所以我的所有文件都在一个 ..\Project1 文件夹(+ 子文件夹)中。甚至因为用户不是windows用户,而是SQL Server用户。

我的问题是选择哪个文件夹..\

目前我(成功)使用此代码进行检索..\

uses ShlObj;

function GetSpecialFolder(const CSIDL: integer) : string;
var
  RecPath : PWideChar;
begin
  RecPath := StrAlloc(MAX_PATH);
    try
    FillChar(RecPath^, MAX_PATH, 0);
    if SHGetSpecialFolderPath(0, RecPath, CSIDL, false) 
      then result := RecPath
      else result := '';
    finally
      StrDispose(RecPath);
    end;
end;

我称之为

GetSpecialFolder(CSIDL_APPDATA)

这里定义了 CDISL 的列表。

GetSpecialFolder(CSIDL_APPDATA)C:\Users\username\AppData\Roaming在 Windows 7 中返回。

所以这曾经有效,但最近我收到了一些客户的投诉,这些投诉似乎与这些文件夹中的读/写问题直接相关。(例如C:\Users\username\AppData\Roaming\Project1\LoginHistory- 使用上面列出的文件夹)。

所以我的问题是:使用正确CSIDL_APPDATA吗?你还有什么建议吗?在某些操作系统上或某些权限确实降低的用户是否有可能在该文件夹上出现读/写问题?

请记住,我不希望我的文件有多个根文件夹。

4

2 回答 2

5

我认为您想CSIDL_COMMON_APPDATA用于非用户特定的文件。如果您假设(在您的代码中)存储的文件CSIDL_APPDATA在用户之间共享,这是不允许的。

于 2011-02-23T12:32:16.723 回答
0

我最终使用的方法是正确的。因为我的应用程序并不真正需要公共文件(所有临时文件都是用户特定的,这是有道理的——因为少数常见的东西都存储在数据库中)CSIDL_APPDATA是一个好地方。

我面临的问题仍然不清楚,但我怀疑这是因为 login.ini 是一个保留字(仅在最近,可能是最近的一些 Windows 更新之后)。

我已经问过这个问题了

于 2011-03-30T09:33:33.180 回答