C#使用動態庫DllImport("kernel32")讀寫ini文件的步驟
1 ini文件讀寫
kernel32.dll是windows中非常重要的32位動態鏈接庫文件,屬于內核級文件。它控制著系統的內存管理、數據的輸入輸出操作和中斷處理,當windows啟動時,kernel32.dll就駐留在內存中特定的寫保護區域,使別的程序無法占用這個內存區域。
為什么要來討論讀寫ini文件呢,難道有數據庫我們就不用讀寫文件了嗎,什么數據都從數據庫讀取出來嗎,有些東西是根據客戶的習慣,就沒必要去讀取數據庫了,或者說,比如你要做一個記住密碼的功能,如果在web端,你還可以用cookie這東西,但是要是winform呢,這時候ini文件就可以派上用場了。我們可以把用戶和密碼存在ini文件里。
注意事項:
- ini文件路徑必須完整
- 可將ini放在程序所在目錄,此時ipfilename參數為“.\filename.ini”
2 方法
(1)getprivateprofileint :使用該方法可獲取ini類型數據,未獲取到時則會取設置的默認數據
uint winapi getprivateprofileint ( _in_lpctstr lpappname, //ini文件中區塊名稱 _in_lpctstr lpkeyname, //鍵名 _in_int ndefault, //默認值 _in_lpctstr lpfilename //ini文件路徑 );
(2)getprivateprofilestring:使用該方法可獲取string類型數據,未獲取到時則會取設置的默認數據
uint winapi getprivateprofilestring ( _in_lpctstr lpappname, //ini文件中區塊名稱 _in_lpctstr lpkeyname, //鍵名 _in_int ndefault, //默認值 _in_lpstr lpreturnedstring,//接受ini文件中值的cstring對象,指定一個字符串緩沖區,長度至少為nsize _in_dword nsize,//指定裝載到ipreturnedstring緩沖區的最大字符數 _in_lpctstr lpfilename //ini文件路徑 );
(3)writeprivateprofilestring:向ini中寫值,所以僅有寫入string就足夠了
bool writeprivateprofilestring( lpctstr lpappname,//ini文件中區塊名 lpctstr lpkeyname,//鍵名 lpctstr lpstring,//鍵值 lpctstr lpfilename );
3 例子
using system.io; using system.runtime.interopservices; using system.text; using system.windows; namespace wpfapplication3 { /// /// mainwindow.xaml 的交互邏輯 /// public partial class mainwindow : window { public mainwindow() { initializecomponent(); iniclass ini = new iniclass(); string inipath = system.windows.forms.application.startuppath + "\\temp.ini";//引用里添加form才可以 string section = "bigbang"; ini.setpath(inipath); ini.iniwritevalue(section, "1", "amy"); ini.iniwritevalue(section, "2", "sheldon"); string section1 = "family"; ini.setpath(inipath); ini.iniwritevalue(section1, "1", "phil"); ini.iniwritevalue(section1, "2", "jay"); string re = ini.inireadvalue(section, "1"); system.windows.messagebox.show(re); } } public class iniclass { [dllimport("kernel32")] private static extern long writeprivateprofilestring(string section, string key, string value, string filepath); [dllimport("kernel32")] private static extern long getprivateprofilestring(string section, string key, string def, stringbuilder retval, int size, string filepath); private string inipath; public void setpath(string inipath) { this.inipath = inipath; } public void iniwritevalue(string section, string key, string value) { writeprivateprofilestring(section, key, value, this.inipath); } public string inireadvalue(string section, string key) { stringbuilder temp = new stringbuilder(500); getprivateprofilestring(section, key, "", temp, 500, inipath); return temp.tostring(); } public bool existfile() { return file.exists(this.inipath); } } }
注意:
wpf中引入windowsforms控件的方法為:引用添加system.windows.forms.integration與system.windows.forms;