2015-11-30 81 views
1

如果我用这个Delphi代码如何使用Delphi获取INI文件的绝对路径?

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

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

+0

为什么不将默认路径设置为与应用程序路径相同?例如使用'TIniFile.Create(changefilext(paramstr(0),'.ini'))'将你的ini文件放在与你的可执行文件相同的文件夹中。 – theodorusap

+1

@theodorusap并打破有关UAC的每个规则? – whosrdaddy

+1

你一定这样做是错误的。您必须停止将文件放入Windows目录或依靠虚拟化。事实上,你真的应该停止使用长期弃用的Win16反向compat API。不要问什么是完整的路径,提供完整的路径。并切换到'TMemIniFile'。 –

回答

0

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

从文档(重点煤矿):

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

lpAppName [IN]

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

lpKeyName [in]与字符串关联的密钥名称 。如果指定部分中不存在密钥,则创建它 。如果此参数为NULL,则删除整个部分(包括 部分中的所有条目)。

lpString [in]要写入文件的空终止字符串。如果 该参数为NULL,则删除由lpKeyName参数 指向的键。

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

如果lpFileName参数不包含该文件的完整路径和文件名,则WritePrivateProfileString将在Windows的 目录中搜索该文件。如果该文件不存在,则此功能 将在Windows目录中创建该文件。

这最后一条评论意味着您的程序必须以管理员身份运行。逻辑结果是,如果您的程序未以管理员身份运行,则默认路径为C:\Users\Windows username\AppData\Local\VirtualStore\Windows。 因此,要遵守现代Windows规则,最好的做法是为ini文件提供完整路径...

+2

'这最后的评论意味着您的程序必须以管理员身份运行 - 除非应用程序运行在例如映射(某些)文件到虚拟Windows目录 – mjn

+1

@mjn的终端服务环境中,请参阅我最近的更新 – whosrdaddy

相关问题