zoukankan      html  css  js  c++  java
  • c# 使用GetPrivateProfileString 读ini数据 失败

    项目中用到 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]" + "
    ");
                        writer.Write("Version=" + _Version + "
    ");
                        writer.Write("Enable_Log=0" + "
    ");
    
                        //writer.Write("#WorkMode 1:单次, 2:批量" + "
    ");
                        writer.Write("WorkMode=2" + "
    ");//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('', ' ');
                return s.Trim();
            }
    
    
    
  • 相关阅读:
    Python学习笔记:pip使用技巧
    机器学习笔记:训练集、验证集和测试集区别
    MySQL学习笔记:3道面试题小测
    Python学习笔记:精确的四舍五入
    Hive学习笔记:列转行之collect_list/collect_set/concat_ws
    Python学习笔记:6个代码性能坏习惯
    爬虫学习笔记:打造自己的代理池
    Mysql学习笔记:5.5升级至8.0版本
    机器学习笔记:sklearn.model_selection.train_test_split切分训练、测试集
    HashSet其实就那么一回事儿之源码浅析
  • 原文地址:https://www.cnblogs.com/scotth/p/10729502.html
Copyright © 2011-2022 走看看