C#操作ini文件的问题

原创 2006年06月14日 20:47:00

 

  本来操作ini文件调用windows提供的那几个api是非常简单的事,可是在C#中用来却不见的那么
舒畅,主要是因为API调用后返回的串值上的问题.
  在.net的sdk中提供的示例是用StringBuilder和IntPtr类来获取调用后返回的串值.以下是sdk
中的Buffers示例:
  LibWrap
{
	
	[ DllImport( , CharSet=CharSet.Auto )]
	    GetSystemDirectory( StringBuilder sysDirBuffer,  size );  
	
	
	[ DllImport( , CharSet=CharSet.Auto )]
	    GetUserName( StringBuilder userNameBuffer,   size );	
    
	
    [DllImport(, CharSet=CharSet.Auto)]
       IntPtr GetCommandLine();	
}

  App
{
	   Main()
	{
	
	StringBuilder sysDirBuffer =  StringBuilder(  );
	LibWrap.GetSystemDirectory( sysDirBuffer, sysDirBuffer.Capacity );
	Console.WriteLine( , sysDirBuffer );
	
	
	StringBuilder userNameBuffer =  StringBuilder(  );
	 size = userNameBuffer.Capacity;
	LibWrap.GetUserName( userNameBuffer,  size );
	Console.WriteLine( , userNameBuffer );
	
        IntPtr cmdLineStr = LibWrap.GetCommandLine();
         commandLine = Marshal.PtrToStringAuto( cmdLineStr );
        Console.WriteLine( , commandLine );		
	}
}

  表面上以上的例子完全达到了我们的目的.可是当调用的api返回的串是用  分隔的n条串时(如下面用
到的GetPrivateProfileSectionNames和GetPrivateProfileSection)以上的方法就只能获取最前面的一条
串了,因为.net中的 Marshal类提供的方法和StringBuilder类的ToString()只是简单的截取  前的串数
据,所以后面的数据就给无辜的丢弃了.

  有朋友想到了用byte数组来缓存串数据的方法 -- 分配一个很大的byte数组把数组的指针用托管的方式
封送给API(添加[MarshalAs(UnmanagedType.LPArray)]特性),再用System.Text提供字符编码转换类(
ASCIIEncoding、UTF8Encoding)把byte数组里的串数据转换为String类数据.这种方法虽然实现了我们的伟
大目标,但在串的转换上却损失了不少的性能.

  我个人经过一翻的探索发现一个目前来讲比较好的解决方法. 这个方法的主要思想是:
  ,string类允许我们用char、sbyte类型的数据来填充构造函数,所以我们有办法预先分配一个足够的缓冲
    区来存储我们要的返回串数据;
  ,我们同样可以把string类型的数据的指针用托管的方式封送给API,Ansi的API添加[MarshalAs(
    UnmanagedType.LPStr)]特性,unicode的API添加[MarshalAs(UnmanagedType.LPWStr)]特性.
    注意:如果存在unicode的API最好使用unicode的API,因为.net中的string类存储的unicode字符串且,Ansi
    的API也是调用unicode的API的,所以我们直接调用unicode的API减免了CLR把Ansi字符串转换为unicode
    字符串的步骤,自然性能上也就不同了.

  OK!下面是我实现的ini文件操作类的代码:



  CIni
{
	#region 段信息的获取
	
	[DllImport(, EntryPoint = , CharSet= CharSet.Unicode )]
            getSectionNames(
        [MarshalAs(UnmanagedType.LPWStr )]  szBuffer,  nlen,  filename);

	
	[DllImport(,EntryPoint=, CharSet = CharSet.Unicode)]
            getSectionValues( Section,
        [MarshalAs(UnmanagedType.LPWStr)]  szBuffer,  nlen,  filename);
	#endregion


	#region 键值的获取和设置
	
	[DllImport(,EntryPoint= , CharSet = CharSet.Unicode)]
	    getKeyIntValue( Section, Key, nDefault, FileName);

	
	[DllImport(,EntryPoint= , CharSet = CharSet.Unicode)]
	    getKeyValue( section, key, lpDefault,
        [MarshalAs(UnmanagedType.LPWStr)]  szValue,  nlen,  filename);

	
	
	
	[DllImport(,EntryPoint= , CharSet = CharSet.Unicode)]
	    setKeyValue( Section, key, szValue, FileName);

	
	[DllImport(,EntryPoint = , CharSet = CharSet.Unicode)]
	    setSectionValue( section, szvalue, filename);
	#endregion

	    []sept={  };	

	  m_Path=;		

	
	
	
	  Path
	{
		set {m_Path=value;}
		get { m_Path;}
	}
	
	 CIni(){}
	 CIni( szPath)
	{
		m_Path=szPath;
	}

	
	
	
	  []SectionNames
	{
		get
		{	
			 buffer =  (  ,);
			 nlen = getSectionNames(buffer,-,m_Path)-;
			 (nlen >0 )
			{
			 buffer.Substring(,nlen).Split(sept);
			}
			 ;
		}
	}	

	
	
	
        
        
	
         [] SectionValues( section, bufferSize)
        {
             buffer =  (  , bufferSize);
             nlen = getSectionValues(section, buffer, bufferSize, m_Path) - ;
             (nlen > )
            {
                 buffer.Substring(, nlen).Split(sept);
            }
             ;
        }
         [] SectionValues( section)
        {
             SectionValues(section, );
        }

	
        
	
	
	
	
         Dictionary<string, > SectionValuesEx( section,  bufferSize)
	{
            [] sztmp = SectionValues(section, bufferSize);
		 (sztmp !=)
		{
		 ArrayLen=sztmp.Length;
		 ( ArrayLen >0)
		{
                    Dictionary<string, > dtRet =  Dictionary<string, >();
			 ( i=;i <ArrayLen;i++)
			{
			 pos1=sztmp[i].IndexOf(  );
			 (pos1 >1)
			{
				 nlen=sztmp[i].Length;
                            
				pos1++;
				 (pos1<nlen)
                             dtRet.Add(sztmp[i].Substring(, pos1-), sztmp[i].Substring(pos1, nlen - pos1));
			}
			}
                     dtRet;
		}
		}
		 ;
	}
         Dictionary<string, > SectionValuesEx( section)
        {
             SectionValuesEx(section, );
        }

	
	
	
	
	
	
	  setSectionValue( section, szValue)
	{
		 setSectionValue(section,szValue,m_Path);
	}

	
	
	
	
	
	
	  getKeyIntValue( section, key)
	{
		 getKeyIntValue(section,key,-,m_Path);
	}
	
	
	
	
	
	
	
	
	  setKeyIntValue( section, key, dwValue)
	{
		 setKeyValue(section,key,dwValue.ToString(),m_Path);
	}

	
	
	
	
	
	
	  getKeyValue( section, key)
	{
		 szBuffer=  (  ,);
		 nlen=getKeyValue(section,key,, szBuffer,,m_Path);
		 szBuffer.Substring(,nlen-);
	}
    
	
	
	
	
	
	
	
	  setKeyValue( Section , key, szValue)
	{
		 setKeyValue(Section,key,szValue,m_Path);
	}
	}

CIni类的使用示例

 

C#读取ini配置文件注意的问题

C#和Win32 API函数 C#并不像C++,拥有属于自己的类库。C#使用的类库是.Net框架为所有.Net程序开发提供的一个共有的类库――.Net FrameWork SDK。虽然.Net Fr...
  • xinm1001
  • xinm1001
  • 2016年10月14日 20:37
  • 1388

如何在C#中读写INI文件

INI文件的结构 INI文件是一种按照特点方式排列的文本文件。每一个INI文件构成都非常类似,由若干段落(section)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键词(keyword...
  • ddjj_1980
  • ddjj_1980
  • 2016年12月02日 15:21
  • 3124

C#进行INI文件的读写

using System; using System.IO; using System.Runtime.InteropServices; using System.Text; using System...
  • liucherish
  • liucherish
  • 2017年02月17日 17:06
  • 1422

INI文件的操作

INI文件是WINDOWS的一种文件标准,以文本格式来存储信息 ,他一般用来保存应用程序的一写配置参数 。其中的数据组织格式为: ;注释 [Section1 Name] KeyName1=value1...
  • suxinpingtao51
  • suxinpingtao51
  • 2013年10月31日 10:50
  • 1789

C#中读写INI文件的方法例子

[DllImport("kernel32")]         private static extern long WritePrivateProfileString(string secti...
  • Andrewniu
  • Andrewniu
  • 2017年06月20日 13:11
  • 375

C# winform中读写ini文件

C# winform中读写ini文件
  • source0573
  • source0573
  • 2015年11月05日 21:13
  • 3661

C# 创建ini文件

INI文件就是扩展名为"INI"的文件,其实他本身是个文本文件,可以用记事本打开,主要存放的是用户所做的选择或系统的各种参数。 INI文件并不是普通的文本文件。它有自己的结构,由若干段落(SECTI...
  • lishk314
  • lishk314
  • 2014年03月17日 21:52
  • 685

在C#中读写INI配置文件

在作应用系统开发时,管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起,现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Ma...
  • u010655348
  • u010655348
  • 2016年01月12日 22:43
  • 1228

C# ini 文件解析库

ini解析 因为需要使用C#进行ini 文件读写操作, 看到官方说解析ini文件需要使用xml读写库。感觉太过麻烦。因为先前有MFC 读写INI文件的经验,感觉API非常简单,所以稍微封装了一下。...
  • hesiyuan4
  • hesiyuan4
  • 2015年07月01日 10:55
  • 1408

c# 账号密码加密, 写入读取ini文件

[DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, st...
  • zheng2263
  • zheng2263
  • 2015年12月08日 22:01
  • 1213
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#操作ini文件的问题
举报原因:
原因补充:

(最多只允许输入30个字)