c# 文件操作 txt、xml、ini
1. txt文件
/// <summary> /// 读文本文件信息 /// </summary> /// <param name="FilePath"></param> /// <returns></returns> public static List<string> ReadTxtFile(string FilePath) { List<string> strList = new List<string>(); System.IO.FileStream FS = null; System.IO.StreamReader SR = null; if (System.IO.File.Exists(FilePath) ) { try { if (strList == null) strList = new List<string>(); //using自动释放资源 using (FS = new System.IO.FileStream(FilePath, System.IO.FileMode.Open)) { SR = new System.IO.StreamReader(FS, System.Text.Encoding.Default); string Line = null; System.Drawing.Color color = new System.Drawing.Color(); string[] rgb = new string[4]; for (Line = SR.ReadLine(); Line != null; Line = SR.ReadLine()) { if (!(Line.Trim() == "")) { strList.Add(Line); } } } } catch (Exception ex) { throw (ex); } finally { if (SR != null) { SR.Dispose(); SR.Close(); } if (FS != null) { FS.Dispose(); FS.Close(); } } } else { strList = null; } return strList; }
/// <summary> /// 保存文本文件信息 /// </summary> /// <param name="psList">要写入文件的信息</param> /// <param name="filepath">存放文件的绝对路径</param> /// <returns></returns> public static bool SaveToTxtFile(List<string> psList,string filepath) { bool bResult = false; System.IO.FileStream FS = null; System.IO.StreamWriter SW = null; try { //新建文件流 FS = new System.IO.FileStream(filepath, System.IO.FileMode.Create, System.IO.FileAccess.Write); //建立文件对应的输入流 SW = new System.IO.StreamWriter(FS); foreach (string ps in psList) { SW.Write(ps+"\r\n"); } bResult = true; } catch { bResult = false; } finally { if (SW != null) { SW.Close(); } if (FS != null) { FS.Close(); } } return bResult; }
2. xml文件
XmlDocument xmldoc = new XmlDocument();//声明一个xml文档操作类的新实例 string path = System.Windows.Forms.Application.StartupPath + @"../../../"; Directory.SetCurrentDirectory(path); string portpath = Directory.GetCurrentDirectory() + @"\Program\FeedBackSetting.xml";//存放xml文件的绝对路径 xmldoc.Load(portpath); XmlNode node = xmldoc.SelectSingleNode("FeedBack");//找到xml中的一个节点 node.SelectSingleNode("ThreShold").InnerText = txtThreshold.Text; node.SelectSingleNode("Sensitivity").InnerText = txtSensitivity.Text; node.SelectSingleNode("Speed").InnerText = txtSpeed.Text; xmldoc.Save(portpath);
c#代码创建xml文件在看下??
3. ini文件
INI文件就是扩展名为“ini”的文件。在Windows系统中,INI文件是很多,最重要的就是“System.ini”、“System32.ini”和“Win.ini”。该文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配置。但自从Windows 95的退出,在Windows系统中引入了注册表的概念,INI文件在Windows系统的地位就开始不断下滑,这是因为注册表的独特优点,使应用程序和系统都把许多参数和初始化信息放进了注册表中。但在某些场合,INI文件还拥有其不可替代的地位。
INI文件的结构
INI文件是一种按照特点方式排列的文本文件。每一个INI文件构成都非常类似,由若干段落(section)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键词(keyword)和一个等号,等号右边的就是关键字对应的值(value)。其一般形式如下:
[Section1]
KeyWord1 = Valuel
KeyWord2 = Value2
……
[Section2]
KeyWord3 = Value3
KeyWord4 = Value4
注意:ini文件的第一行需要空出,不保留任何信息。(因项目中经常出现因为ini文件的数据顶格而产生的各种问题)
C#和Win32 API函数
C#并不像C++,拥有属于自己的类库。C#使用的类库是.Net框架为所有.Net程序开发提供的一个共有的类库——.Net FrameWork SDK。虽然.Net FrameWork SDK内容十分庞大,功能也非常强大,但还不能面面俱到,至少它并没有提供直接操作INI文件所需要的相关的类。在本文中,C#操作INI文件使用的是Windows系统自带Win32的API函数——WritePrivateProfileString()和GetPrivateProfileString()函数。这二个函数都位于“kernel32.dll”文件中。
我们知道在C#中使用的类库都是托管代码(Managed Code)文件,而Win32的API函数所处的文件,都是非托管代码(Unmanaged Code)文件。这就导致了在C#中不可能直接使用这些非托管代码文件中的函数。好在.Net框架为了保持对下的兼容,也为了充分利用以前的资源,提出了互操作,通过互操作可以实现对Win32的API函数的调用。互操作不仅适用于Win32的API函数,还可以用来访问托管的COM对象。C#中对Win32的API函数的互操作是通过命名空间“System.Runtime.InteropServices”中的“DllImport”特征类来实现的。它的主要作用是指示此属性化方法是作为非托管DLL的输出实现的。下面代码就是在C#利用命名空间“System.Runtime.InteropServices”中的“DllImport”特征类申明上面二个Win32的API函数:
C#申明INI文件的写操作函数WritePrivateProfileString():
[ DllImport ( "kernel32" ) ]
private static extern long WritePrivateProfileString ( string section , string key , string val , string filePath ) ;
参数说明:section:INI文件中的段落;key:INI文件中的关键字;val:INI文件中关键字的数值;filePath:INI文件的完整的路径和名称。
C#申明INI文件的读操作函数GetPrivateProfileString():
[ DllImport ( "kernel32" ) ]
private static extern int GetPrivateProfileString ( string section ,string key , string def , StringBuilder retVal , int size , string filePath ) ;
参数说明:section:INI文件中的段落名称;key:INI文件中的关键字;def:无法读取时候时候的缺省数值;retVal:读取数值;size:数值的大小;filePath:INI文件的完整路径和名称。
using System.Runtime.InteropServices; #region ini文件读写 /*写数据函数参数说明: * section:INI文件中的段落; * key:INI文件中的关键字; * val:INI文件中关键字的数值; * filePath:INI文件的完整的路径和名称。 */ [DllImport("kernel32")] public static extern long WritePrivateProfileString(string section, string key, string val, string filePath); /*读数据函数参数说明: section:INI文件中的段落名称; * key:INI文件中的关键字; * def:无法读取时候时候的缺省数值; * retVal:读取数值; * size:数值的大小; * filePath:INI文件的完整路径和名称。 */ [DllImport("kernel32")] public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); #endregion //获取ini文件 private string GetPortName() { string port = ""; string section = "COM";//INI文件中的段落名称 string key = "PortName"; StringBuilder temp = new StringBuilder(255); string filepath = Application.StartupPath + @"\Amp.ini"; try { Common.GetPrivateProfileString(section, key, "没有找到配置数据!", temp, 255, filepath); port = temp.ToString(); if (port == "没有找到配置数据!") { port = ""; } } catch { port = ""; } return port; } //保存ini文件 private void SaveToAmpIni(string section, string key, string val) { string filename = Application.StartupPath + @"\Amp.ini"; Common.WritePrivateProfileString(section, key, val, filename); }