② .NET访问文件
虽然首选的数据访问是通过一个后台数据库或者XML方式,但你却很少有机会来选择数据访问的方式。一般而言,公司中必然会富于大量遗产数据 (Legacy data),所以你必须能够访问各种不同的数据源。文本文件就是其中一个普通的方式。.NET类中的长数组以System.IO空间名称的方式提供了需要的功能。现在让我们详细查看如何使用这一空间名称来访问文件内容。
流(Streams)
.NET框架使用流来处理各种输入类型。一个流代表着输入或者输出到一个数据源的数据流动,数据源即为一个流的后端(文件,Socket等)。
System.IO空间名称包含抽象的基本Stream类。这一类定义了以字节方式读取或写入原始数据的操作。你无需处理原始数据,但你必须处理建立的存储格式,如文件或者网络Sockets。
System.IO空间名称包括很多类,这些类能够将Stream类扩展为处理各种不同的存储方法。这些类包括以下:
- Directory:提供了处理与路径有关的方法,比如建立,复制,移动,以及删除。
- File:提供了处理与文件操作有关的方法,比如建立,建立,移动,以及删除。
- FileStream:提供了同步和异步的文件操作。
- MemoryStream:处理内存中存储的数据。
- StringReader:访问与string有关的数据(使用TextReader类)。
- StringWriter:建立与string有关的数据(使用TextWriter类)。
- TextReader:用于读取一个顺序字符。
- TextWriter:用于写入一个顺序字符。
以上为System.IO空间名称的例子,你可以看到蕴藏的灵活性。这些类的一个不足之处是,一个流作为前台方式服务于其它一个类,这就有可能在第一个流上执行多余的处理。和文件操作一样,这些方法被应用于加密或者缓冲等处理。
既然我们已经建立.NET流的基本知识,现在让我们更深入学习使用流来处理数据文件。
以文本文件方式工作
System.IO空间名称的File类提供了用于文本文件的必需功能。以下VB.NET源代码范例说明了它很容易使用,这一代码片段为显示位于本地硬盘中一个文本文件的内容:
Dim sr as StreamReader
Dim fileContents As String
sr = File.OpenText("c://test.txt")
fileContents = sr.ReadToEnd()
Console.WriteLine(fileContents)
sr.Close()在C#中类似的代码也相当简单:
StreamReadersr = null;
String fileContents = null;
sr = File.OpenText("c://prodinfo.txt");
fileContents = sr.ReadToEnd();
Console.WriteLine(fileContents);
sr.Close();关于这一范例,有几个值得注意的地方。首先,你必须包含System.IO空间名称,以保证代码能按计划而运行。同时,StreamReader类被用于作为Flie类的方法的前台。这一代码范例使用StreamReader类的ReadToEnd方法来读取文件的全部内容,除此之外,还包括以下的其它方法来访问文件的内容:
- ReadLine:在某一时间读取一行。
- Read:使用固定点和长度来读取文件内容。
- ReadBlock:将数据读取到缓冲。
- Peek:读取下一个字符。
你可以使用ReadLine方法一行一行地读取文件的内容,这样可以改变前一范例的读取方式。以下C#代码实现了这一要求:
StreamReadersr = null;
String oneLine = null;
sr = File.OpenText("c://test.txt");
oneLine = sr.ReadLine();
while (oneLine != null) {
Console.WriteLine(oneLine);
oneLine = sr.ReadLine();
}
sr.Close();代码使用while循环在某一时刻一行的方式循环读取整个文件内容。同样,我们还可以利用File类的OpenText方法,但还得包括其它的一些方法,这些方法包括:
- AppendText:在一个文本文件的后尾添加一个文本。
- Cope:将一个文件从一个位置复制到另一位置。
- Create:建立一个用于写入的新文件。
- Delete:删除一个指定的文件。
- Exists:验证一个文件是否存在(返回一个Boolean值)。
- Move:将一个文件从当前位置移动到一个新的位置。
- Open:打开一个文件。
- OpenRead:打开一个用于读取的已经存在的文件。
- OpenWrite:打开一个用于写入的已经存在的文件。
你可以在操作文件之前利用以上的代码并结合Exists方法来验证文件是否存在。以下的VB.NET代码添加了这一方法:
Dim sr As StreamReader
Dim oneLine As String
Dim fileName As String
fileName = "c://prodinfo.txt"
Try
If (File.Exists(fileName)) Then
sr = File.OpenText(fileName)
oneLine = sr.ReadLine()
While Not (oneLine Is Nothing)
Console.WriteLine(oneLine)
oneLine = sr.ReadLine()
End While
sr.Close()
End If
Catch ex As IOException
Console.WriteLine("Error accessing file. " + ex.Message)
End Try除此之外,以上代码将文件访问封装在一个try块中,以获取可能产生的各种错误。在程序中使用了通用IOException(从System.IO名称空间),但也可以使用了特殊异常,如FileLoadException或者FileNotFoundException。你可以浏览System.IO名称空间以获得有关异常的更多信息。