c# 使用GetPrivateProfileString 读ini数据 失败

项目中用到 GetPrivateProfileString可是使用中, 发现 没法读出 ini 配置中的值,函数

好比Enable_log =3 我读到的是 API设置的默认值.测试

网上说可能时字符集编码的问题.ui

https://blog.csdn.net/Yl12fh/article/details/80495092

编码格式的问题,有多是系统语言默认字符集的问题,也有多是项目编码的问题,文件的问题
经排查,形成的缘由是INI文件是用ANSI/utf8等格式保存的,将文件另存为Unicode编码格式,问题解决

带着问题, 测试屡次,发现 字符编码的确会影响!!!

结果:

实际上,用utf8 仍是会出现问题,编码

用Endoing.Default(Endoing.ASCII )就OK, 可是不支持中文..net

确认下项目 编码code

// 声明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();
        }
相关文章
相关标签/搜索