1.1 读写文件
在Pocket PC应用程序的开发领域,读写文件是一项重要的功能。其中读写文本文件和二进制文件是最常见的。下面就通过示例代码介绍如何利用.NET Compact Framework提供的类来实现对文本文件和二进制文件的读写。
1.1.1 创建和打开文件
System.IO命名空间的File和FileStream类,提供了多种创建和打开文件的方法。下面介绍其中几种常用的方法。
File类的CreateText方法可以创建或打开一个用于写入UTF-8编码的文本。如果指定的文件不存在,则创建该文件。如果指定已存在的文件,则打开该文件。以下代码演示如何调用该方法:
…… Dim sw As System.IO.StreamWriter sw = System.IO.File.CreateText("/Program Files/My Directory/working.tmp") …… |
第二种方法可以打开和自动创建文件。该方法由StreamWrite类提供。在创建StreamWriter实例的时候,只需简单地指明文件的完整路径。调用该方法的演示代码如下:
…… Dim sw As System.IO.StreamWriter sw = New System.IO.StreamWriter("/Program Files/My Directory/working.tmp") …… |
FileStream类提供了另外一种常用方法。当创建该类的新实例时,只需简单地指明文件的完整路径,就可以打开和自动创建文件。以下是使用FileStream类的例子:
…… Dim fs As System.IO.FileStream fs = New System.IO.FileStream("data.tmp", IO.FileMode.OpenOrCreate) …… |
1.1.2 Reader类和Writer类
在进行进一步介绍之前,需要介绍一下Reader类和Writer类。.NET Compact Framework提供了一套Reader类和Writer类,用于读写文本文件和二进制文件。其中TextReader和TextWriter方法用于向文件读写字符数据。StreamReader和StreamWriter类用于向文件读写经过特定编码的数据。BinaryReader和BinaryWriter类可以向文件读写二进制的数据。
每一个Reader类,分别按照各自的数据类型从文件读取数据。而Writer类则分别按照各自的数据类型向文件写入数据。
1.1.3 向文件写入数据
通过TextWriter、StreamWriter和BinaryWriter类可以实现对文件的写入操作。如果你希望向文件写入文本数据,则可以使用TextWriter或StreamWriter类。如表11-7列出了TextWriter或StreamWriter类的常用方法。
表11-7:TextWriter 和StreamWriter类的常用方法
方法 | 描述 |
Close | 关闭数据流。 |
Flush | 清除数据流缓冲区,将数据写入文件。 |
Write | 向数据流写入数据。 |
WriteLine | 向数据流写入以行终结符结尾的文本数据。 |
清单11-15演示使用StreamWriter类向文件写入简单的文本数据的示例。该示例首先创建一个StreamWriter类实例并打开working.tmp文件。在这个示例里有两次写入操作。第一次写入操作使用StreamWriter类的Write方法写入一个文本字符串。第二次写入操作使用StreamWriter类的WriteLine方法写入当前日期和时间。WriteLine方法自动插入行终结符。
清单11-15:使用StreamWriter类写文件
…… Dim sw As System.IO.StreamWriter sw = New System.IO.StreamWriter("text.tmp")
sw.Write("该内容写入于:") sw.WriteLine(DateTime.Now)
sw.Close() …… |
如果Pocket PC应用程序需要向文件写入指定类型的数据,随后从文件按照指定数据类型读取数据的话,应该使用BinaryWriter类。表11-8列出了BinaryWriter类的主要方法。
表11-8:BinaryWriter类的主要方法
方法 | 描述 |
Close | 关闭数据流。 |
Flush | 清除数据流缓冲区,将数据写入文件。 |
Seek | 设置在当前数据流的写入位置。 |
Write | 向数据流写入二进制数据。 |
使用BinaryWriter类的Write方法向文件写入数据。该方法支持大多数数据类型。Write方法也能够用于向文件批量写入数组数据。清单11-16 演示使用BinaryWriter类向文件写入一对不同类型的数据。
清单11-16:使用BinaryWriter类写文件
…… Dim bw As System.IO.BinaryWriter Dim fs As System.IO.FileStream Dim bolTemp As Boolean = True Dim intTemp As Integer = 13
fs = New System.IO.FileStream("data.tmp", IO.FileMode.OpenOrCreate) bw = New System.IO.BinaryWriter(fs) bw.Write(bolTemp) ' 写入一个布尔值 bw.Write(intTemp) ' 写入一个整形数字
bw.Close() …… |
1.1.4 从文件读取数据
这节开始介绍如何从文件读取数据。System.IO命名空间提供三种类:TextReader、StreamReader和BinaryReader。象Writer类一样,TextReader、StreamReader用于读取字符数据,BinaryReader类读取指定类型的数据。
表11-9列出了TextReader和StreamReader类的主要方法。其中几个方法都是用于读取数据的,而根本上的差别是返回的数据量不同。
表11-9:TextReader和StreamReader类的主要方法
方法 | 描述 |
Close | 关闭StreamReader并作用到文件。 |
Peek | 从数据流里读取下一个字符。 |
Read | 从数据流里读取下一个字符或多个字符。 |
ReadBlock | 从数据流里读取一批字符。 |
ReadLine | 从数据流里读取一行字符。 |
ReadToEnd | 读取从当前位置到数据流末端的数据。 |
以下代码演示如何使用StreamReader类从文件读取数据的简单示例。在该示例里,使用ReadToEnd 方法一次性读取文件全部内容,该方法常用于文本编辑器或其他与记事本相关的Pocket PC应用程序。如果你希望更多地控制读取数据的过程,则可以使用Read、ReadBlock或ReadLine方法。
…… Dim sr As System.IO.StreamReader
sr = System.IO.File.OpenText("text.tmp") MsgBox(sr.ReadToEnd) sr.Close() …… |
虽然TextReader和StreamReader类能够很好的处理字符数据,但是如果希望Pocket PC应用程序能够处理数字类型的数据,则应该使用BinaryReader类。通过BinaryReader类,可以直接读取指定类型的数据,而无需任何进行数据转换。
BinaryReader类的主要方法如表11-10所示。Read方法实现读取批量数据,适用于BinaryReader类支持的所有数据类型。
表11-10:BinaryReader类的主要方法
方法 | 描述 |
Close | 关闭StreamReader并作用到文件。 |
PeekChar | 读取下一个字符而无需前移数据流中的位置。 |
Read | 从数据流读取数据。 |
ReadBoolean | 从数据流读取布尔数据。 |
ReadByte | 从数据流读取字节数据。 |
ReadBytes | 从数据流读取一批字节数据。 |
ReadChar | 从数据流读取一个字符。 |
ReadChars | 从数据流读取一批字符。 |
ReadDecimal | 从数据流读取十进制值。 |
ReadDouble | 从数据流读取8字节浮点值。 |
ReadInt16 | 从数据流读取一个有符号的2字节整数值。 |
ReadInt32 | 从数据流读取一个有符号的4字节整数值。 |
ReadInt64 | 从数据流读取一个有符号的8字节整数值。 |
ReadSByte | 从数据流读取一个有符号的字节数值。 |
ReadSingle | 从数据流读取一个4字节浮点值。 |
ReadString | 从数据流读取文本字符串。 |
ReadUInt16 | 从数据流取一个无符号的2字节整数。 |
ReadUInt32 | 从数据流取一个无符号的4字节整数。 |
ReadUInt64 | 从数据流取一个无符号的8字节整数。 |
清单11-17演示使用BinaryReader类从文件读取数字类型数据的简单示例。从文件可以读取布尔和其他整数型数值。
清单11-17:使用BinaryReader类读文件
…… Dim br As System.IO.BinaryReader Dim fs As System.IO.FileStream Dim bolTemp As Boolean Dim intTemp As Integer
fs = New System.IO.FileStream("data.tmp", IO.FileMode.Open) br = New System.IO.BinaryReader(fs) bolTemp = br.ReadBoolean() intTemp = br.ReadInt16 MsgBox("Boolean: " & bolTemp.ToString & " -- Integer: " & intTemp.ToString)
br.Close() …… |
1.1.5 使用网络文件
.NET Compact Framework的一项特性就是System.IO命名空间能够直接对网络共享文件进行读写。下面就介绍如何利用System.IO命名空间实现对网络共享文件的读写操作。
为了在网络上存储共享文件,可以直接通过计算机的通用命名规则(UNC)。访问网络共享文件的方法如清单11-18所示。
清单11-18:访问网络共享文件
…… Dim sr As System.IO.StreamReader
sr = System.IO.File.OpenText("/myComputer/MyShare/text.tmp") MsgBox(sr.ReadToEnd) sr.Close() …… |
通过清单 11-18 ,可以发现通过 System.IO 命名空间访问网络共享文件与使用本地文件没有什么差别。访问网络共享文件为移动应用程序开发者提供了又一个处理数据的选择。