最近由于工作上需要做一个自动化测试工具,开始学习了C#。C#是Microsoft 在2000 年7 月推出.NET Framework 的第1 版时提供的一种全新语言。它是一种简单、灵活且功能强大的语言,采用了面向对象的程序设计思想。由于在这之前习惯了用C语言,刚接触C#时感觉不太习惯,不过好在它易于学习,内部有很多现成的方法和接口供我们使用。今天这里我主要跟大家总结一下C#的文件操作。
文件读写是许多.NET 应用程序的一个基础性工作。这里主要讨论用于创建、读写文件的主要类,支持在C#代码中处理文件系统的类。文件是在应用程序的实例之间存储数据的一种便利方式,它也可以用于在应用程序之间传输数据。文件可以存储用户和应用程序配置,以便在下次运行应用程序时检索它们。
1. 流
在.NET Framework 中进行的所有输入和输出工作都要用到流(stream)。流是序列化设备(serial device)的抽象表示。序列化设备可以以线性方式存储数据,并可以按同样的方式访问:一次访问一个字节。此设备可以是磁盘文件、网络通道、内存位置或其他支持以线性方式读写的对象。把设备变成抽象的,就可以隐藏流的底层目标和源。流的类型主要有两种:
-
输出流:当向某些外部目标写入数据时,就要用到输出流。这可以是物理磁盘文件、网络位置、打印机或另一个程序。
-
输入流:用于将数据读入程序可以访问的内存或变量中。到目前为止,我们使用的最常见的输入流形式是键盘。
2.用于输入和输出的类
System.IO 命名空间包含几乎所有的文件操作的类,所以必须在C#应用程序中引用此名称空间才能访问这些类,但无需完全限定类型名。下面介绍我在项目中主要用到的几个类。
-
File类:静态实用类,提供许多静态方法,用于移动、复制和删除文件。可以在类上调用静态方法,而无需创建它们的实例。File类的一些常用的静态方法有Copy(),Create(),Move()和Delete()等。
-
FileInfo类:FileInfo 类不像File 类,它不是静态的,没有静态方法,仅可用于实例化的对象。它表示磁盘或网络位置上的物理文件。该类包含处理此文件的方法。要完成对文件的读写工作,就必须创建Stream 对象。提供文件路径,就可以创建一个FileInfo对象:
FileInfo aFile = new FileInfo(@"D:\Log.txt");
FileInfo 类也提供了与底层文件相关的属性,其中一些属性可以用来更新文件,其中很多属性都继承于FileSystemInfo。比如我们要获取文件的容量(以字节为单位),就可 以用属性Length,返回long值。这个属性是只读的。
3. FileStream类:表示可写或可读,或二者均可的文件。此文件可以同步或异步地读写。FileStream 对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中 读写字节的方法,但经常使用StreamReader 或StreamWriter 执行这些功能。这是因为FileStream 类操作的是字节和字节数组,而Stream 类操作的是字符数据。 4. StreamWriter类:向流写入字符数据,可以使用FileStream 将其创建为基类。可以通过许多方法创建StreamWriter 对象。如果已经有了FileStream 对象,就可以使用此 对象来创建StreamWriter 对象:
FileStream aFile = new FileStream("Log.txt", FileMode.CreateNew);
StreamWriter sw = new StreamWriter(aFile);
也可以直接从文件中创建StreamWriter 对象:
StreamWriter sw = new StreamWriter("Log.txt", true);
这个构造函数的参数是文件名和一个Boolean 值,这个Boolean 值规定是追加文件,还是创建新文件:
-
如果此值设置为false,则创建一个新文件,或者截取现有文件并打开它。
-
如果此值设置为 true,则打开文件,保留原来的数据。如果找不到文件,则创建一个新文件。
StreamWriter 类的两个最重要的方法:Write()和WriteLine()。WriteLine()方法会写入传递给它的字符串,其后跟有换行符。
5. StreamReader类:从流中读取字符数据,可以使用FileStream 将其创建为基类。同StreamWriter 一样,这是一个通用类,可以用于任何流。StreamReader 类包含许多 读取数据的方法。其中该取数据最简单的方法是Read()。此方法将流的下一个字符作为正整数值返回,如果到达了流的结尾处,则返回-1。使用Convert 实用类可以把这 个值转换为字符。
此外,可以使用ReadLine()方法从文件中读取文本。这个方法读取换行符之前的文本,并以字符串的形式返回结果文本。当到达文件尾时,该方法就返回空值,通过这种方法可以测试文件是否已到达了尾部。注意使用了while 循环,以便确保在执行循环体的代码之前读取的行不为空,这样就只显示文件的有效内容:
line = sr.ReadLine();
while(line != null)
{
Console.WriteLine(line);
strLine = sr.ReadLine();
}
对于小型文件,可以使用一个非常方便的方法ReadToEnd()。此方法读取整个文件,并将其作为字符串返回。
这就是在我项目中用到的文件类了,还有一些类没有用到,这里就不一一介绍了。