【问题标题】:How do I get the absolute path of an INI file with Delphi?Delphi如何获取INI文件的绝对路径?
【发布时间】:2016-03-03 21:44:43
【问题描述】:

如果我使用这个 Delphi 代码

with TIniFile.Create('myapp.ini') do
try
  WriteString('SETTINGS', 'key', 'value');
finally
  Free;
end;

要在默认文件夹中创建 INI 文件,有没有办法检索 Windows 用来创建文件的绝对路径?

【问题讨论】:

  • 为什么不将默认路径设置为与应用程序路径相同?例如,使用TIniFile.Create(changefilext(paramstr(0),'.ini')) 会将您的 ini 文件与可执行文件放在同一文件夹中。
  • @theodorusap 并打破有关 UAC 的所有规则?
  • 你肯定做错了。您确实必须停止将文件放在 Windows 目录中,或者停止依赖虚拟化。事实上,你真的应该停止使用早已弃用的 Win16 回兼容 API。不要问完整路径是什么,提供完整路径。并切换到TMemIniFile
  • @DavidHeffernan 是的,这个问题只出现在遗留应用程序迁移期间。几乎所有地方的 INI 文件都是使用特定设置文件夹的完整路径创建的,因此解决方案是修复它使用问题中显示的代码的单个位置。
  • 你真的应该停止使用TIniFile。文档说:提供此功能仅是为了与 16 位版本的 Windows 兼容。

标签: delphi winapi ini


【解决方案1】:

在后台,TInifile.WriteString 使用 WritePrivateProfileString 函数。

来自文档(强调我的):

BOOL WINAPI WritePrivateProfileString(   _In_ LPCTSTR lpAppName,  
    _In_ LPCTSTR lpKeyName,   _In_ LPCTSTR lpString,   
    _In_ LPCTSTR lpFileName );

lpAppName [输入]

字符串将被复制到的部分的名称。如果 部分不存在,它被创建。该部分的名称是 不分大小写;字符串可以是大写和的任意组合 小写字母。

lpKeyName [in] 要关联的键名 用字符串。如果指定部分中不存在该键,则 被建造。如果此参数为 NULL,则整个部分,包括 该部分中的所有条目都将被删除。

lpString [in] 要写入文件的以 null 结尾的字符串。如果 该参数为NULL,lpKeyName参数指向的key 已删除。

lpFileName [in] 初始化文件的名称。如果文件是 使用 Unicode 字符创建,函数写入 Unicode 文件中的字符。否则,函数写入 ANSI 字符。

如果 lpFileName 参数不包含文件的完整路径和文件名,WritePrivateProfileString 将搜索 Windows 文件的目录。如果文件不存在,这个函数 在 Windows 目录中创建文件。

最后一条评论暗示您的程序必须以管理员身份运行。逻辑上的结果是,如果您的程序不是以管理员身份运行的,那么默认路径将是C:\Users\Windows username\AppData\Local\VirtualStore\Windows。 因此,为了遵守现代 Windows 规则,最好为 ini 文件提供完整路径...

【讨论】:

  • This last comment implies that your program must be run as administrator - 除非应用程序运行在例如将(某些)文件映射到虚拟 Windows 目录的终端服务环境中
猜你喜欢
  • 2012-01-19
  • 2012-04-24
  • 2010-09-18
  • 2021-10-18
  • 2016-11-19
  • 2015-09-09
  • 2011-08-30
相关资源
最近更新 更多