2015-11-30 123 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

相關問題