我该把配置文件存放在哪里?

3

我需要在WinXP到Win8中将配置文件读写到Windows磁盘。最好的地方在哪里?似乎ProgramData文件夹不允许。

procedure TfrmMain.FormCreate(Sender: TObject);
var
  path: array[0..MAX_PATH] of char;
begin
   SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
  AppPath:= Path;
  AppPath:= AppPath + '\Customer\';
  if not DirectoryExists(AppPath) then
   CreateDir(AppPath);
 if FileExists(AppPath + 'Customers.cst') then
 LoadFromFile(AppPath + 'Customers.cst');
end;

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 if ListModified  then
 begin
  if MessageDlg('Save Changes?', mtWarning, [mbYes, mbNo], 0) = mrYes  then
   SaveToFile(AppPath + 'Customers.cst');
  canClose:= True;
 end
 else 
canClose:= False;
end;

3
你更可能希望将设置针对每个用户 (CSIDL_APPDATA),而不是每台计算机 (CSIDL_COMMON_APPDATA)。 - Andreas Rejbrand
1
https://dev59.com/RFnUa4cB1Zd3GeqPdsQ- - Ken White
1
此外,Ken在这里的帖子对我很有帮助:http://stackoverflow.com/questions/11222132/what-causes-this-error-unable-to-write-to-application-file-ini - RobertFrank
1个回答

10
CSIDL_COMMON_APPDATA被描述为

包含所有用户应用程序数据的文件系统目录。

由于它在计算机上的所有用户之间共享,您需要具有管理员权限才能将其写入该位置。如果您希望您的配置被所有用户共享,则CSIDL_COMMON_APPDATA是正确的位置。但是,在写入该位置时,您需要确保具有足够的权限。
如果您确实需要让应用程序写入CSIDL_COMMON_APPDATA,则通常的方法是在安装过程中为应用程序创建一个目录。因为您的安装程序将以提升的方式运行,所以它可以执行此操作。它还必须向新目录添加一个宽松的ACL,以便您的应用程序稍后在标准用户下运行时可以将其写入该文件夹。
如果您想要存储在用户配置文件中的配置,则应选择CSIDL_APPDATA下的位置描述为

文件系统目录,用作应用程序特定数据的公共存储库。

由于这在用户配置文件中,因此机器上的每个用户都将拥有配置文件的单独副本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接