配置文件读写操作(.ini)

使用C#实现对配置文件(config.ini)的读写操作;
以下为基本操作函数源码,包括不同数据类型参数的读写:string、bool、int、double

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

public class FileIni
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
        [DllImport("kernel32.dll")]
        public static extern bool CloseHandle(IntPtr hObject);
        public const int OF_READWRITE = 2;
        public const int OF_SHARE_DENY_NONE = 0x40;
        public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);

        //判断文件是否被占用 占用=true 未占用 = false
        public static bool isFileOccupied(string path)
        {
            if (!File.Exists(path))
                return true;
            IntPtr vHandle = _lopen(path, OF_READWRITE | OF_SHARE_DENY_NONE);
            if (vHandle == HFILE_ERROR)
                return true;
            CloseHandle(vHandle);
            return false;
        }

        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileInt(string section, string key, int def, string filePath);

        public static bool isFileExists(string path)
        {
            if (!(File.Exists(path)))
            {
                MessageBox.Show("文件:" + path + "不存在", "ini文件不存在");
                return false;
            }
            return true;
        }

        //=====================//=====================//=====================Write data
        #region  写INI参数
        public static void WriteString(string path, string section, string key, string value)
        {
            // section=配置节,key=键名,value=键值,path=路径
            WritePrivateProfileString(section, key, value, path);
        }
        public static void WriteInt(string path, string section, string key, int value = 0)
        {
            string strRead = ReadString(path, section, key);
            string[] strArr = strRead.Split(new char[] { ';' });
            string strNote = ";";
            string strWrite;
            if (strArr.Length > 1)//保留原有注释
            {
                for (int i = 1; i < strArr.Length; i++)
                    strNote += strArr[i];
                strWrite = value.ToString() + strNote;
            }
            else
            {
                strWrite = value.ToString();
            }
            WritePrivateProfileString(section, key, strWrite, path);
        }
        public static void WriteDouble(string path, string section, string key, double value = 0)
        {
            string strRead = ReadString(path, section, key);
            string[] strArr = strRead.Split(new char[] { ';' });
            string strNote = ";";
            string strWrite;
            if (strArr.Length > 1)//保留原有注释
            {
                for (int i = 1; i < strArr.Length; i++)
                    strNote += strArr[i];
                strWrite = value.ToString() + strNote;
            }
            else
            {
                strWrite = value.ToString();
            }
            WritePrivateProfileString(section, key, strWrite, path);
        }
        public static void WriteBool(string path, string section, string key, bool value = false)
        {
            string strValue = (value ? "1" : "0");
            string strRead = ReadString(path, section, key);
            string[] strArr = strRead.Split(new char[] { ';' });
            string strNote = ";";
            string strWrite;
            if (strArr.Length > 1)//保留原有注释
            {
                for (int i = 1; i < strArr.Length; i++)
                    strNote += strArr[i];
                strWrite = strValue + strNote;
            }
            else
            {
                strWrite = strValue;
            }
            WritePrivateProfileString(section, key, strWrite, path);
        }
        #endregion

        //=====================//=====================//=====================Read data
        #region  读INI参数
        public static string ReadString(string path, string section, string key)
        {
            // 每次从ini中读取多少字节
            System.Text.StringBuilder temp = new System.Text.StringBuilder(255);
            // section=配置节,key=键名,temp=上面,path=路径
            GetPrivateProfileString(section, key, "", temp, 255, path);
            String str = temp.ToString();
            string[] strArr = str.Split(new char[] { ';' });
            string strRead = "";
            if (strArr.Length > 0)
            {
                strRead = strArr[0];
            }
            return strRead;
        }
        public static int ReadInt(string path, string section, string key, int defValue = 0)
        {
            return GetPrivateProfileInt(section, key, defValue, path);
        }
        public static double ReadDouble(string path, string section, string key, double defValue = 0)
        {
            System.Text.StringBuilder temp = new System.Text.StringBuilder(255);
            GetPrivateProfileString(section, key, defValue.ToString(), temp, 255, path);
            String str = temp.ToString();
            string[] strArr = str.Split(new char[] { ';' });
            double ReData;
            if (strArr.Length > 0)
            {
                ReData = Convert.ToDouble(strArr[0]);
            }
            else
            {
                ReData = defValue;
            }
            return ReData;
        }
        public static bool ReadBool(string path, string section, string key, int defValue = 0)
        {
            int val = GetPrivateProfileInt(section, key, defValue, path);
            if (val != 0)
                return true;
            else
                return false;
        }
        #endregion
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值