項目中用到 GetPrivateProfileString但是使用中, 發現 無法讀出 ini 配置中的值,
比如Enable_log =3 我讀到的是 API設置的默認值.
網上說可能時字符集編碼的問題.
https://blog.csdn.net/Yl12fh/article/details/80495092
編碼格式的問題,有可能是系統語言默認字符集的問題,也有可能是項目編碼的問題,文件的問題
經排查,造成的原因是INI文件是用ANSI/utf8等格式保存的,將文件另存為Unicode編碼格式,問題解決
帶着問題, 測試多次,發現 字符編碼的確會影響!!!
結果:
實際上,用utf8 還是會出現問題,
用Endoing.Default(Endoing.ASCII )就OK, 但是不支持中文.
確認下項目 編碼
// 聲明INI文件的寫操作函數 WritePrivateProfileString()
[System.Runtime.InteropServices.DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
// 聲明INI文件的讀操作函數 GetPrivateProfileString()
[System.Runtime.InteropServices.DllImport("kernel32")]
//private static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);
private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
//創建文件
FileInfo fi = new FileInfo(_IniPath);
if (!fi.Exists)
{
var outputStream = File.Create(_IniPath);//OK 覆蓋寫
//讀寫異常bug 20190418
//INI文件是用ANSI/utf8等格式保存的,將文件另存為Unicode編碼格式,
//創建ini文件 string編碼格式, 讀取ini string 編碼 要相同.
//default (ASCII)問題解決!!!
//UTF8失敗, ASCII 不支持中文,半角
using (var writer = new StreamWriter(outputStream, Encoding.ASCII))
{
writer.AutoFlush = false;
writer.Write("[App]" + "\r\n");
writer.Write("Version=" + _Version + "\r\n");
writer.Write("Enable_Log=0" + "\r\n");
//writer.Write("#WorkMode 1:單次, 2:批量" + "\r\n");
writer.Write("WorkMode=2" + "\r\n");//1:單次, 2:批量 else unknow
writer.Flush();
writer.Close();
writer.Dispose();
}
outputStream.Dispose();//需要釋放,否則,其他程序無法讀寫 若不想讓其他人改動,就不用處理,最后進程析構
}
//修改文件
//read ini
//讀取INI文件指定
public static string INI_ReadString(string INI_Path, string section, string key, string Default)
{
Byte[] Buffer = new Byte[128];//512 65535
//int bufLen = GetPrivateProfileString(section, key, Default, Buffer, Buffer.GetUpperBound(0), INI_Path);
int bufLen = GetPrivateProfileString(section, key, Default, Buffer, 128, INI_Path);
//設定 Unicode,UTF8 的編碼方式,否則無法支持中文 , 還是有bug
// 1.刪除文件 2. 自動創建文件后 或 修改后
//只能支持ASCII(default)
string s = Encoding.GetEncoding(Encoding.ASCII.CodePage).GetString(Buffer,0, bufLen);
// s = s.Substring(0, bufLen);
//s.Replace('\0', ' ');
return s.Trim();
}