1、第9章 文件,VB 2005提供了强大的文件访问与处理功能。它除了提供传统的文 件访问方式外,还可以使用System.IO命名空间访问文件,并且新 增了一个性能更加强大的My.Computer.FileSystem对象。 本章主要介绍文件的基本概念,以及在VB 2005中访问各种类型文 件的方法。,9.1 文件的结构和文件的分类,文件是指存储在外部物理介质上的数据的集合。它可以永久性地保 存数据。计算机操作系统是以文件为单位对数据进行管理的。 这一节主要介绍文件的结构和分类。,9.1.1 文件的结构,为了有效地存取数据,数据必须以某种特定方式存放,这种方式称为文件的结构。基本的文件结构有:字符
2、、字段、记录。 1. 字符(Character) 字符是数据的最小单位,是构成文件的最基本单位。字母、数字、特殊符号都可以看成是一个字符。 2. 字段(Field) 字段也称为域,是指由某种数据类型及若干字符组成的一项数据,通常表示特定含义。 3. 记录(Record) 记录是由一个或多个相关联的字段组成,是计算机处理数据的基本单位。 文件就是记录的集合。,9.1.2 文件的分类,根据不同的分类标准,文件可分为不同的类型。 1. 根据数据性质分类 根据数据的性质,文件可以分为程序文件和数据文件。 2. 根据数据的存储形式分类 根据数据的存储形式,文件可以分为顺序文件和随机文件。 3. 根据数据
3、的编码分类 根据数据的编码,文件可以分为ASCII文件和二进制文件。,9.2 访问文件,根据不同类型的文件,访问数据的方式也不相同。VB 2005提供了 三种文件访问模式:顺序访问模式、随机访问模式、二进制访问模 式。访问文件,基本操作步骤一般都须经过以下三步完成: 1) 首先打开文件,如果文件不存在应先创建文件。 2) 当文件打开后,就可以对文件进行读或写操作了。 3) 当文件操作完毕,应该关闭文件。,9.2.1 使用传统的方式访问文件,VB 2005支持以前版本传统的文件访问方式。传统的文件访问方式就是通过调用VB系统提供的文件访问函数来访问文件。不同类型的文件,访问时使用的函数也有所差异
4、。常用的文件访问函数访问的文件类型,见表。,9.2.1 使用传统的方式访问文件,1. 访问顺序文件 顺序文件访问模式的规则最简单,读取时从第1条记录“顺序”读到最后一条记录,写入时也一样,不可以在数据间随意跳转。 将数据写入顺序文件,通常有3个步骤:打开、写入和关闭。从顺 序文件读取数据到内存的步骤也有3个步骤:打开、写入和关闭。 (1) 打开文件 打开或创建文件调用FileOpen函数, 其语法格式如下: FileOpen (文件编号,文件名,模式 ,存取方式,共享方式,记录长度 ) (2) 关闭文件 关闭文件调用FileClose函数,其语法格式如下: FileClose ( 文件编号 ,
5、文件名, ),9.2.1 使用传统的方式访问文件,【例9-1】打开C盘下的file.txt文件,并显示该文件的文件号、文件名和字符数,然后关闭。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickDim arr(10) As SingleDim fileName As StringDim fileNum As IntegerfileName = InputBox$(“请输入要打开的文件名:“) 输入要打开的文件fileNum = F
6、reeFile() 得到文件号FileOpen(fileNum, fileName, OpenMode.Output) 打开指定文件 显示文件信息MessageBox.Show(“打开文件名是“ + fileName + “的文件,该文件的文件号是“ + Str(fileNum)FileClose(fileNum) 关闭文件 End Sub,9.2.1 使用传统的方式访问文件,(3) 写操作 将数据写入磁盘文件调用Print、PrintLine、Write和WriteLine函数。这4个函数的格式相同,其语法格式如下: Print (文件编号 , Output ) PrintLine (文件编
7、号 , Output ) Write (文件编号 , Output ) WriteLine (文件编号 , Output ),9.2.1 使用传统的方式访问文件,【例9-2】使用Print、PrintLine函数向file.txt文件中写入数据。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickFileOpen(1, “c:file.txt“, OpenMode.Output) 打开指定文件Print(1, “大家“) 写入数据,
8、不包括换行符Print(1, “好!“)PrintLine(1) 写入换行符PrintLine(1, “欢迎使用“, TAB(), “VB 2005!“) 写入数据,包括换行符PrintLine(1, “VB 2005“, TAB(), “是VB的最新版本。“)PrintLine(1, SPC(3), “它具有强大的文件操作功能。“)FileClose(1) 关闭文件 End Sub,9.2.1 使用传统的方式访问文件,【例9-3】使用Write、WriteLine函数向newfile.txt文件中写入数据。 Private Sub Button1_Click(ByVal sender As
9、System.Object, ByVal e As System.EventArgs) Handles Button1.ClickFileOpen(1, “c:newfile.txt“, OpenMode.Output) 打开指定文件Write(1, “Visual Studio 2005“) 写入数据,不包括换行符Write(1, “是新一代的开发平台。“)WriteLine(1) 写入换行符WriteLine(1, “它“, TAB(), “功能强大,“) 写入数据,包括换行符WriteLine(1, SPC(3), “使用简单,“)WriteLine(1, TAB(10), “是程序开发
10、人员的最好选择。“)FileClose(1) 关闭文件 End Sub,9.2.1 使用传统的方式访问文件,(4) 读操作 读取顺序文件的操作常用到Input、LineInput和InputString函数。其语法格式如下: Input (文件编号,变量名) LineInput (文件编号) InputString (文件编号,表达式),9.2.1 使用传统的方式访问文件,【例9-4】使用Input、LineInput和InputString函数读取file.txt和newfile.txt文件中的数据。 Private Sub Button1_Click(ByVal sender As Sys
11、tem.Object, ByVal e As System.EventArgs) Handles Button1.Click 调用Input函数事件Dim str1 As StringFileOpen(1, “c:newfile.txt“, OpenMode.Input) 打开指定文件Input(1, str1) 读取数据赋给变量str1MessageBox.Show(str1) 显示读取数据Input(1, str1)MessageBox.Show(str1)Input(1, str1)MessageBox.Show(str1)Input(1, str1)MessageBox.Show(st
12、r1)FileClose(1) 关闭文件 End Sub,9.2.1 使用传统的方式访问文件,Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 调用LineInput函数事件Dim str2 As StringFileOpen(1, “c:newfile.txt“, OpenMode.Input) 打开指定文件str2 = LineInput(1) 读取数据赋给变量str2MessageBox.Show(str2) End Sub
13、 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 调用InputString函数事件Dim str3 As StringFileOpen(1, “c:newfile.txt“, OpenMode.Input) 打开指定文件str3 = InputString(1, 10) 读取数据赋给变量str3MessageBox.Show(str3) End Sub,9.2.1 使用传统的方式访问文件,(5) 几个重要的文件函数 1) Lo
14、c函数。 Loc函数返回一个Long数据类型的值,该值指定打开文件中当前的读/写位置。 2) LOF函数。 LOF函数返回Long数据类型的值,表示用FileOpen函数打开的文件的大小(以字节为单位)。 3) Eof函数。 Eof函数表示当到达以随机或顺序Input模式打开的文件尾时,返回Boolean数据类型值True。 4) FileCopy函数。 FileCopy函数将指定的文件复制到指定路径。,9.2.1 使用传统的方式访问文件,【例9-5】使用文件函数,确定file.txt文件当前读写的位置,该文件的大小和长度,并将newfile1.txt文件其拷贝到D盘下,重命名为newfile
15、1.txt。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 调用Loc函数事件FileOpen(1, “c:file.txt“, OpenMode.Output)MsgBox(Loc(1)FileClose(1) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button
16、2.Click 调用LOF函数事件FileOpen(1, “c:file.txt“, OpenMode.Output)MsgBox(LOF(1)FileClose(1) End Sub,Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 调用FileLen函数事件Dim str1 As Stringstr1 = FileLen(“c:newfile.txt“)MsgBox(str1) End Sub Private Sub Butt
17、on4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click 调用FileCopy函数事件FileCopy(“c:newfile.txt“, “d:newfile1.txt“) End Sub,9.2.1 使用传统的方式访问文件,2. 访问随机文件 在随机访问模式中,文件的存取是按记录进行操作的,每个记录都 有记录号并且长度全部相同。在程序的变量说明部分采用用户自定 义类型说明语句StructureEnd Structure,首先定义记录的结构 类型,然后再将变量说明成该类
18、型,这样就为这个变量申请了内存 空间,用于存放随机文件中的记录。 (1) 打开和关闭文件 打开随机文件仍然调用FileOpen函数,与打开顺序文件不同的是 使用Random模式,并且需要指明每条记录的长度RecordLength 值,即记录中各字段长度之和,也与程序首部定义的结构类型变量 的长度相同。关闭随机文件仍然调用FileClose函数。,9.2.1 使用传统的方式访问文件,(2) 读写操作 打开随机文件后,就可以进行读写操作。随机文件可以同时进行写 入和读取操作。随机文件的写操作调用FilePut函数,其语法格式如下: FilePut (文件编号,变量名,记录号,ArrayIsDyna
19、mic ,StringIsFixedLength ),9.2.1 使用传统的方式访问文件,【例9-6】用随机访问模式创建一个职工数据文件(employee.dat),并输出文件内容。 Structure em 用户自定义记录类型Dim num As StringDim name As StringDim sex As String End Structure Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click 输入数据事件Dim
20、 emp() As emDim i, n As IntegerFileOpen(1, “c:employee.dat“, OpenMode.Random)n = InputBox(“请输入职工数:“) 输入记录个数ReDim emp(n)For i = 1 To n 依次输入每个记录数据emp(i).num = InputBox$(“请输入编号:“)emp(i).name = InputBox$(“请输入姓名:“)emp(i).sex = InputBox$(“请输入性别:“)FilePut(1, emp(i), i + 1) 调用FilePut函数输入数据NextFileClose() En
21、d Sub,9.2.1 使用传统的方式访问文件,Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button2.Click 输出数据事件Dim emp As emDim i, n As IntegerDim str As StringFileOpen(1, “c:employee.dat“, OpenMode.Random)str = “编号 姓名 性别“ & Chr(13)i = 1While Not EOF(1) 依次读取每个记录数据FileGet
22、(1, emp) 调用FileGet函数输出数据str = str & emp.num & “ “ & emp.name & “ “ & emp.sex & Chr(13)图9-12 随机文件输出i = i + 1End WhileMessageBox.Show(str) 在消息框中输出数据FileClose() End Sub,9.2.1 使用传统的方式访问文件,(3) 常用对话框控件 一些应用程序常常需要打开和保存文件,以及选择字体、颜色、打印等操作,这 时需要应用程序提供相应的对话框,进行操作。VB 2005提供的对话框控件有: 打开文件对话框控件(OpenFileDialog)、保存对
23、话框控件 (SaveFileDialog)、字体对话框控件(FontDialog)、颜色对话框控件 (ColorDialog)、文件夹对话框(FolderBrowserDialog)等,在工具箱上显 示如图所示。,9.2.3 使用System.IO命名空间访问文件,1. 流的概念及其类型 .NET Framework使用流来支持读取和写入文件。可以将流视为一 组连续的一维数据,包含开头和结尾,并且其中的游标指示了流中 的当前位置。 文件和流是有区别的。文件通常表示位于磁盘上的文件和目录,具 有文件名和路径。而流则提供读写后端存储的方法,后端存储包括 磁盘、网络、内存和磁带等。 流是字节序列的抽
24、象概念,是一个在Unix里面经常使用的对象。可 以把流当作一个通道,程序的数据可以沿着这个通道“流”到各种数 据存储机构(例如文件、字符串、数组或者其他形式的流等)。一 般来说,流要比文件的范围要稍广一些,除文件流之外也存在多种 流,如网络流、内存流和缓冲流等。,9.2.3 使用System.IO命名空间访问文件,2. 流的操作 流的操作一般涉及三个基本方法: 1) 可以从流读取。读取是从流到数据结构(如字节数组)的数据传输。 2) 可以向流写入。写入是从数据源到流的数据传输。 3) 流可以支持查找。查找是对流内的当前位置进行的查询和修改 所有与I/O相关的类都位于System.IO命名空间。
25、System.IO命名空间中提供了以下功能: 1) 创建、删除和操作目录及文件。 2) 对目录和文件进行监视。 3) 从流中读写数据。 4) 随机访问文件。 5) 使用多种枚举常量设置文件和目录的操作。,9.2.3 使用System.IO命名空间访问文件,【例9-8】使用System.IO命名空间,向C盘下名为testfile.txt文件写入数据,并读取其文本信息,显示到输出窗口中。 Imports System 引用System命名空间 Imports System.IO Class Form1 Private Sub Form1_Load(ByVal sender As System.Ob
26、ject, ByVal e As System.EventArgs) _ Handles MyBase.LoadDim sw As StreamWriter = New StreamWriter(“c:TestFile.txt“) 声明一个StreamWriter对象swsw.Write(“北京奥运会将在“) 不换行写入数据sw.WriteLine(“2008年月日举行。“) 换行写入数据sw.WriteLine(“-“)sw.Write(“今天的日期是:“)sw.WriteLine(DateTime.Now)sw.Close() 关闭对象swDim sr As StreamReader =
27、New StreamReader(“c:TestFile.txt“) 声明一个StreamReader对象srDim line As StringDoline = sr.ReadLine() 读取一行文本Console.WriteLine(line) 输出到输出窗口Loop Until line Is Nothing 循环读取每行文本sr.Close() 关闭对象sr End Sub End Class,9.2.4 使用其它方法处理字符,访问文件,其实就是访问文件中的字符串数据。程序员可以读取、 写入字符串,通常用“&”和“+”来处理字符串连接。也可以使用 String类的方法来处理字符串。S
28、tring类常用的方法见表。,9.2.4 使用其它方法处理字符,程序员还可以使用.NET Framework提供的方法处理String类中的 字符串,功能类似于字符串函数。.NET Framework常用的处理字 符串的方法见表。,9.2.4 使用其它方法处理字符,【例9-9】向C盘下file.txt文本文件中依次写入以下文本:Unicode的前12个码 位(0到127)对应于标准美国键盘上的字母和符号。显示输出,并可以指定截 取字符、添加字符和统计字数。 Private Sub Insert_Click(ByVal sender As System.Object, ByVal e As Sy
29、stem.EventArgs) _ Handles Button1.Click 输入文本事件FileOpen(1, “c:file.txt“, OpenMode.Output) 打开指定文件PrintLine(1, RichTextBox1.Text) 写入文本FileClose(1) End Sub Private Sub Input_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button2.Click 输出文本事件Dim str1 As StringFileOpen(1, “c:f
30、ile.txt“, OpenMode.Input) 打开指定文件Input(1, str1)RichTextBox2.Text = str1FileClose(1) End Sub,9.2.4 使用其它方法处理字符,Private Sub CountCharToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles CountCharToolStripMenuItem.ClickDim ch As IntegerMsgBox(RichTextBox2.Text.Len
31、gth) End Sub Private Sub SubCharToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles SubCharToolStripMenuItem.ClickDim m, n As Integerm = InputBox(“请输入截取起始位置:“)n = InputBox(“请输入截取字符数:“)MsgBox(RichTextBox2.Text.Substring(m, n) End Sub Private Sub InsertCharToo
32、lStripMenuItem_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles InsertCharToolStripMenuItem.ClickDim i As IntegerDim str As Stringi = InputBox(“请输入添加字符位置:“)Str = InputBox(“请输入添加字符:“)RichTextBox2.Text = RichTextBox2.Text.Insert(i, str) End Sub,9.3 使用My.Computer.FileSystem对象
33、访问文件,在VB 2005中,引入了一个全新的概念 My.Computer.FileSystem对象,它提供了可简化文件I/O的访问方 法和属性。 这一节主要介绍My.Computer.FileSystem对象访问文件的方法。,9.3.1 My.Computer.FileSystem对象简介,My命名空间是VB 2005中的一项新功能,它提供了简单而直观的 方法来访问大量.NET Framework类,从而使VB程序员能够与计算 机、应用程序、设置、资源等进行交互。My提供了几个完全不同 的类:My.Application、My.Computer、My.Forms、 My.Resources、
34、My.Settings、My.User和My.WebServices。 其中My.Computer对象提供用于处理计算机组件(如音频、时钟、 键盘、文件系统等)的属性。My.Computer对象可以完成许多任 务,例如确定远程计算机是否可用、上传/下载文件、从剪贴板中 读取数据、将音频保存到剪贴板等。My.Computer对象提供了许多属性,例如Audio、Clipboard、FileSystem、Keyboard、 Network等。其中My.Computer.FileSystem对象提供用于处理驱 动器、文件和目录的属性及方法。VB 2005通过通过使用 My.Computer.FileS
35、ystem对象可以非常方便快捷的访问文件,包 括读取数据、写入数据、复制等等操作。,9.3.2 My.Computer.FileSystem对象常用的属性和方法,My.Computer.FileSystem对象提供了许多属性。见表。My.Computer.FileSystem对象还提供了许多方法。见表。,9.3.3 My.Computer.FileSystem对象的使用,程序员可以使用My.Computer.FileSystem对象的属性和方法访问文件和目录。【例9-10】使用My.Computer.FileSystem对象,在C盘下新建一个名为myfile 的文件夹,然后在该文件夹下新建一个
36、名为file.txt的文本文件,并向该文件输入 数据,最后输出该文件数据。 编写事件代码: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click 创建文件夹事件My.Computer.FileSystem.CreateDirectory(“C:myfile“) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Eve
37、ntArgs) _ Handles Button2.Click 创建文件并输入数据事件My.Computer.FileSystem.WriteAllText(“C:myfilefile1.txt“, “ABCDEFG“, False) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button3.Click 输出文件数据事件Dim fileContents As StringfileContents = My.Computer.Fil
38、eSystem.ReadAllText(“C:myfilefile1.txt“)MsgBox(fileContents) End Sub,9.3.3 My.Computer.FileSystem对象的使用,【例9-11】创建一个类似于Word的文本编辑器,该文本编辑器包括下拉菜单、 快捷菜单和工具栏。可以新建、打开、关闭文档,还可以编辑文档,包括复制、 粘贴操作。 在Form1中输入代码: 声明全局变量 Public fileName As String Public fileContents, filetext As String Sub Createfile() 新建文档过程Form2.M
39、diParent = MeForm2.Text = “新文档“Form2.Show()Form2.RichTextBox1.ContextMenuStrip = Me.ContextMenuStrip1filetext = Form2.RichTextBox1.Text End Sub,9.3.3 My.Computer.FileSystem对象的使用,Sub Openfile() 打开文档过程OpenFileDialog1.DefaultExt = “TXT“ 打开对话框默认文件类型OpenFileDialog1.Filter = “文本文件(*.TXT)|*.TXT“ 设定文件类型Open
40、FileDialog1.ShowDialog() 调用打开文档对话框If OpenFileDialog1.FileName “ ThenfileName = OpenFileDialog1.FileName 读取文件名Dim fileContents As StringfileContents = My.Computer.FileSystem.ReadAllText(fileName) 使用My.Computer.FileSystem对象的ReadAllText属性从文件中读取文本Form2.RichTextBox1.Text = fileContentsForm2.MdiParent = M
41、eForm2.Text = fileNameForm2.Show()ElseMsgBox(“没有选择要打开的文件名!“, “提示“)fileName = “End If End Sub,9.3.3 My.Computer.FileSystem对象的使用,Sub Savefile(ByVal text As String) 保存过程SaveFileDialog1.DefaultExt = “TXT“ 保存对话框默认文件类型SaveFileDialog1.Filter = “文本文件(*.TXT)|*.TXT“ 设定文件类型SaveFileDialog1.ShowDialog() 调用保存对话框I
42、f SaveFileDialog1.FileName “ ThenfileName = SaveFileDialog1.FileName 读取文件名My.Computer.FileSystem.WriteAllText(fileName, Text, True) 使用My.Computer.FileSystem对象的WriteAllText属性将文本写入文件ElseMsgBox(“没有输入要保存的文件名!“, “提示“)fileName = “End If End Sub Sub Copy() 复制过程Dim activeForm As Form = Me.ActiveMdiChildIf (
43、Not activeForm Is Nothing) ThenDim theBox As RichTextBox = CType(activeForm.ActiveControl, RichTextBox)If (Not theBox Is Nothing) ThenClipboard.SetDataObject(theBox.SelectedText)End IfEnd If End Sub,9.3.3 My.Computer.FileSystem对象的使用,Sub Paste() 粘贴过程Dim activeForm As Form = Me.ActiveMdiChildIf (Not a
44、ctiveForm Is Nothing) ThenDim theBox As RichTextBox = CType(activeForm.ActiveControl, RichTextBox)If (Not theBox Is Nothing) ThenDim data As IDataObject = Clipboard.GetDataObject()If (data.GetDataPresent(DataFormats.Text) ThentheBox.SelectedText = data.GetData(DataFormats.Text).ToString()End IfEnd I
45、fEnd If End Sub Sub Displayfont() 字体过程FontDialog1.ShowColor = TrueFontDialog1.Font = Form2.RichTextBox1.FontFontDialog1.Color = Form2.RichTextBox1.ForeColorIf FontDialog1.ShowDialog Windows.Forms.DialogResult.Cancel ThenForm2.RichTextBox1.Font = FontDialog1.FontForm2.RichTextBox1.ForeColor = FontDia
46、log1.ColorEnd If End Sub,9.3.3 My.Computer.FileSystem对象的使用,Private Sub NewoolStripMenuItem_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles NewToolStripMenuItem.Click 新建下拉菜单事件Createfile() End Sub Private Sub OpenToolStripMenuItem_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles OpenToolStripMenuItem.Click 打开下拉菜单事件Openfile() End Sub ,9.3.4 快捷访问文件,在VB 2005中,程序员除了可以在代码编辑窗口中,直接输入程序 代码访问文件,还可以通过快捷方式插入代码段来访问文件。 程序员在代码编辑窗口中,单击鼠标右键,在快捷菜单中选择“插 入代码段”选项。系统自动显示一个下拉列表,选择“文件系统”选 项,再选择相应的选项,系统会在代码编辑窗口中自动插入相应的 文件访问语句。,