c#关于ini配置文件的烦恼

作者&投稿:焦诞 (若有异议请与网页底部的电邮联系)
c#中ini和XML配置文件各有什么优缺点。~

都一样!!没什么区别!!,只是INI看看起来更直观一点而已!!

你看看在发布的环境下,Application.StartupPath 是什么值,是你发布的“根目录”吗?

ini是配置文件的一种,配置文件可以多种多样的,包括xml。

先说kernel32.dll,它是windows内核心动态库,也就是我们说的动态库函数,该函数时windows实现内核的基础,在每个windows版本中都在集成,位置在system32下。利用C#的导入功能可以调用window库,也就是我们常说的API编程。如果是kernel32或user32等类似库时不须下载,直接就可以调用的。

再说配置文件,ini与xml均是文本级配置文件,类似的还是c#的自身配置文件config(其实它也是一个xml文件)。

ini文件的特点是每个配置占一行,如果有注释,也要单独占一行。配置内容与配置名称用=号分割,如果配置键为两个时,中间用分号分割,功能块用方括号说明。

如:

[.Database]
Database=127.0.0.1
//这是注释
UserName=kusirp21;Password=123

[.File]
Directory=
//没有配置时等号后可以为空。

这种配置文件在windows系列中常见,一般是用kernel32进行解析。至于说其过时,这倒未必——当前的win8系统中还是使用的ini进行配置的,如win.ini等文件。系统中并未使用xml文件[非系统软件除外,系统软件并非指的是安装好系统就存在的软件,如纸牌游戏等均不是系统文件,而是系统附带文件,但其实也是ini保存的游戏结果]。

xml配置也比较常见,在开发的各类软件中,一般都会采用xml文件。它其是就是扩展标签语言。它需要一个根结构[做配置文件时],如:

<?xml version="1.0" charset="utf-8" ?>
<Configurations>
<Database>
<database>127.0.0.1</database>
<username>sa</usename>
</Database>
</Cnfigurations>

这种配置文件较为灵活的是,可以增加不同的属性,以实现配置的细微差别。与ini对比另一个优势是,可以实现多级配置结构,因为xml存在节点树结构关系。同时可以根据属性不同性实现多个相同的配置如:
<?xml version="1.0" charset="utf-8" ?>
<Configurations>
<Database type="config1">
<database>127.0.0.1</database>
<username>sa</usename>
</Database>
<Database type="config2">
<database>127.0.0.1</database>
<username>sa</usename>
</Database>
</Cnfigurations>

所以说,它存在灵活的优点。配置方式也十分灵活。相比之下ini的配置相形见拙了!

但并不是说ini配置没有任何优点的,很多人都以为xml配置文件是发展方向,其实ini同样挑着大梁!它的优点却是xml所不具备的!

ini的读取十分快速,单配时十分灵活,这是xml所不具备的!

我们知道使用xml配置必须经过xml解析,然后才可以得到相应的配置信息。而这一解析过程使用xml的速度降低。而ini只读入即可进行处理,尤其在随机配置时。比如我当前只须要配置信息中的一个配置信息(或是读取使用,或时写入配置),如果是xml不管如果都要解析为xml对象后才可以进行处理,而ini如果是读取,一般可以快速定位到[]节结构,最差也只是将配置文件读取完全而已。写入时,只须写在节结构后直接增加,如果没有节结构,只须要对文件进行append即可,甚至读取都不要,速度与效率上xml根本无法匹敌!这也是ini为何存在的原因。

所以ini并非过时,在windows8系统下大量存在——难以想象微软会在自己的系统中在量使用过时的东西么?倒是手机的安桌系统中大量使用xml,这种情况只能说明xml应用越来越广泛,但并非说明ini已经过时。

梦里寻他已经给出了ini通过windows API的处理,还是不错的。倒是应用程序级配置能不用则不用,如果从事开发,你就知道为什么了!应用程序级配置指的是那些与应用程序同名,后边加一个xml的文件,一般我们做到配置集中管理时,使用app.config而不是使用“文件名.exe.xml”或“文件名.dll.xml”。在项目属性中增加配置,直接会导致生成应用程序级配置文件的生成。如果有些固定配置,如果图片之类的,一般不涉及修改的,建议使用资源包进行完成。资源包内可以增加文件配置文件[配置级],也可以直接增加属性。倒是直接使用项目属性配置是最差的一种做法。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace IniDemo
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);

[DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(string section,string key,string def, StringBuilder retVal,int size,string filePath);

public Form1()
{
InitializeComponent();

//从ini文件中获取值
StringBuilder sb = new StringBuilder();
GetPrivateProfileString("root", "name1", "", sb, 1024, "./config.ini");

textBox1.Text = sb.ToString();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//窗体关闭时保存文件框中的值
WritePrivateProfileString("root", "name1", textBox1.Text, "./config.ini");
}
}
}

kernel32.dll是一个系统的动态链接库,不用下载,程序运行时会自动在c:/windows/system32寻找这个文件

//没有什么过时不过时之说
//ini配置文件 简单,速度快,操作方便还是比较常用 的,如果配置比较简单的话建议使用ini配置文件




额,c#没有直接操作ini文件的类

方法一:关于配置文件微软提供了app.config专门的在vs里面新建一个“应用程序配置文件”就可以了,用c#自带的配置文件管理类用起来很方便,没有必要去整kernel32.dll

方法二:用xml文件来保存配置文件

方法三:也可以吧ini文件用StreamReader和StreamWriter类来实现读写,虽然有点山寨,但是也是可行的,哈哈



ini配置文件,在C#里使用的时候实际上是调用底层的win32API程序。
xml配置文件,是C#默认的配置文件类型,简单的说,它存储的数据都是树状结构,就是大家常说的节点,子节点这种方式。
首先你说的ini比较简单,xml你不了解,这么说吧,ini和xml都比较简单,ini操作上没有xml那么灵活,我们写程序,不可能遇到自己不了解,不熟悉的东西,就选择绕过去,那样就永远没有进步。
其次,你一直在强调代码,其实你还是不明白配置文件是什么意思,我觉得你首先搞懂你所要实现功能的整个过程,还需要别人给你写的代码吗?
整个过程,无非就是把输入内容存起来到指定位置,然后下次打开程序的时候,到指定位置去读取出来,显示在界面上。那么你只需要了解写xml保存和读出来xml文件,取出你需要的内容这个关键的部分就行了。
那你接下来了解,什么是xml文件,xml文件是什么内容,什么样子的,怎么读取指定数据,怎么添加,怎么保存,顺着这个思路,下来你就能找到解决之道了。
你的烦恼仅仅是你不知道怎么学习,仅此而已,看人弄好的,下次你还得有更多的烦恼。

C#读写INI还是比较简单的,需要引用kernel32.dll,

[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern long GetPrivateProfileString(string section, string key,string def, StringBuilder retVal, int size, string filePath);
/// <summary>
        /// 读取ini文件
        /// </summary>
        /// <param name="Section">段落</param>
        /// <param name="Key">关键字</param>
        /// <param name="NoText">关键字对应的值</param>
        /// <param name="iniFilePath">文件路径</param>
        /// <returns></returns>
        public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath)
        {
            if (File.Exists(iniFilePath))
            {
                StringBuilder temp = new StringBuilder(1024);
                GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);
                return temp.ToString();
            }
            else
            {
                return String.Empty;
            }
        }

        /// <summary>
        /// 写ini
        /// </summary>
        /// <param name="Section">段落</param>
        /// <param name="Key">关键字</param>
        /// <param name="NoText">关键字对应的值</param>
        /// <param name="iniFilePath">文件路径</param>
        /// <returns></returns>
        public static bool WriteIniData(string Section, string Key, string Value, string iniFilePath)
        {
            if (File.Exists(iniFilePath))
            {
                long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);
                if (OpStation == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }

更多关于INI的信息你可以到论坛中了解http://dobug.net/showtopic-31.html




天门市18348438719: C#对ini文件操作的一些疑问,请高手解答下!
班琰洛庆: 解答一:直接写就可以呀[FILE] PATH=D:\ STUDENT=HUFUJIE SCHOOL=HUAZHOU ADDRESS=MIDDLE2 对于问题二三 我觉得可以换个角度考虑,你可以将一个标准的key写到数据库中,然后再ini文件中循环去判有没有key,有的话就将其value读出来.

天门市18348438719: 如何在C#应用程序中使用INI文件 -
班琰洛庆: c#的类没有直接提供对ini文件的操作支持,可以自己包装win api的WritePrivateProfileString和GetPrivateProfileString函数实现.下面提供一个包装类,可以直接使用.public class Ini { // 声明INI文件的写操作函数 WritePrivateProfileString() [...

天门市18348438719: c# 中能不能把 配置文件 ini 相关的代码写在单独的类中?要是能写该怎么写?求高手指教 -
班琰洛庆: 方法有很多种,常用并且简单容易实现的有两种.一种是序列化类,然后通过将序列化后的类写到ini里面,读取的时候反序列化.另一种就是直接把ini当做xml文件来处理,写入也是xml格式的.

天门市18348438719: C#用户控件怎么取得INI配置文件绝对路径 -
班琰洛庆: 只能获得当前程序的 EXE 文件的路径 就是你运行程序的路径 MessageBox.Show(System.Windows.Forms.Application.ExecutablePath.ToString()); System.Windows.Forms.Application.ExecutablePath 这个就是当前程序EXE文件的路径 如果你把EXE文件和INI文件放在一个路径下 那么 就把/之后的EXE文件名去掉 然后加上INI 的文件名 就行了 这只不过是个字符串处理的过程

天门市18348438719: 用C#如何读写配置文件? -
班琰洛庆: INI文件就是扩展名为"ini"的文件. 其一般形式如下: [section1] // 配置节 //键名 //键值 keyword1 = valuel keyword2 = value2 …… [section2] keyword3 = value3 keyword4 = value4 在Windows系统中,INI文件是很多,最重要的就是"System.ini...

天门市18348438719: c# 应用程序 存取ini配置文件的问题 -
班琰洛庆: public class IniFile { //文件INI名称public string Path; /**/ ////声明读写INI文件的API函数[DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32")] ...

天门市18348438719: c#读写INI文件 -
班琰洛庆: ini文件其实就是一个文本文件,它有固定的格式,节Section的名字用[]括起来,然后换行说明key的值:[section] key=value 如数据库服务器配置文件:DBServer.ini [Server] Name=localhost [DB] Name=NorthWind [User] Name=sa 在C#中,对配...

天门市18348438719: 如何用c#读写配置文件 -
班琰洛庆: 如果配置文件是普通文件,就用文本方式操作 如果配置文件是XML文件,那么就用XML库解析一下XML

天门市18348438719: c#制作activex控件其他文件应该放在哪 比如说引用的dll和相关的配置文件*.ini -
班琰洛庆: 你得先下载一个kernel32.dll然后在你的项目中添加引用下面是我做过的一个例子,你可以参考一下publicclassinifile{#region导入dll函数[DllImport("kernel32.dll")]publicexternstaticintGetPrivateProfileIntA(stringsegname,stringkeyname,intidefault,...

天门市18348438719: C# ini 读取问题 -
班琰洛庆: 只要是本质是文本的 都可以通过FileStream读出来

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网