在我的应用程序中,我在每台机器上都将一些文件存储在应用程序文件夹中。
真实案例的简化版本是这样的:
..\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
吗?你还有什么建议吗?在某些操作系统上或某些权限确实降低的用户是否有可能在该文件夹上出现读/写问题?
请记住,我不希望我的文件有多个根文件夹。