670 likes | 759 Views
第 12 章 处理文件. Visual Basic 程序设计教程. 本章介绍: · 使用文件系统控件 · 使用有关的语句和函数 · 操作顺序文件 · 操作随机文件 · 使用文件系统对象. 12.1 概述. · 为什么要引入了数据文件 · 文件标识符 · 文件分类:程序文件和数据文件 · 数据文件按存储方法的不同,可分为以下三种类型: 1 .顺序文件 2 .随机文件 3 .二进制文件 · 数据文件的操作形式. 12.2 操作顺序文件数据的例子.
E N D
第12章 处理文件 Visual Basic 程序设计教程
本章介绍: · 使用文件系统控件 · 使用有关的语句和函数 · 操作顺序文件 · 操作随机文件 · 使用文件系统对象 Visual Basic程序设计教程
12.1 概述 • · 为什么要引入了数据文件 • · 文件标识符 • · 文件分类:程序文件和数据文件 • · 数据文件按存储方法的不同,可分为以下三种类型: • 1.顺序文件 • 2.随机文件 • 3.二进制文件 • · 数据文件的操作形式 Visual Basic程序设计教程
12.2 操作顺序文件数据的例子 • 【例12-1】设计一个如图12.1所示的界面,该窗体上有1个驱动器列表框、1个文件夹列表框、1个文件列表框和一个文本框。当启动窗体后,用户在驱动器列表框选择驱动器后,文件夹列表框显示选中驱动器下的文件夹,用 • 户双击相应的文件夹,在文件列 • 表框中显示该文件夹下的所有文 • 本文件(.txt),用户双击相应的文件就可以在文本框中显示该文件内容。 Visual Basic程序设计教程
12.3 使用文件系统控件 • ·VB提供了三种文件系统控件,它们是:驱动 • 器列表框(DriveListBox)、文件夹列表框(DirListBox)和文件列表框(FileListBox)。 Visual Basic程序设计教程
12.3.1 驱动器列表框 • ·驱动器列表框是下拉式列表框,用来显示当 • 前系统中所有有效的驱动器(包括远程连接的驱动器)。通过这个下拉列表框用户可以选择驱动器。 • ·1.属性 • 2.常用事件:Change事件。 Visual Basic程序设计教程
2.常用事件:Change事件。 Visual Basic程序设计教程
12.3.2 文件夹列表框 • ·文件夹列表框以树形展开方式显示某个驱动器或文件夹内的各个子文件夹名,并用打开的文件夹图标来表示选定的文件夹,称当前目录。 • ·属性 Path:用来设置当前文件夹名或返回所选择的文件夹名. List:该属性的类型为字符串数组,它的每一个列表项的内容是选定磁盘或文件夹下的各子文件夹名 Visual Basic程序设计教程
ListCount:表示当前文件夹下的子文件夹个数。 ListIndex:它取值的有效范围为-n~ListCount-1。 • 其中,-1是当前选定文件 • 夹在List属性列表中的序 • 号,从0~ListCount-1则 • 为它的子文件夹在List属 • 性(数组)中的序号(下标),而当前文件夹的父文件 夹是绝对值大于1的负数,如图12.3所示。 Visual Basic程序设计教程
·常用事件 • Chang事件。当鼠标双击新文件夹或改变Path属性时,触发Change事件,Change事件发生后,改变了文件夹列表框的Path属性,即改变了当前文件夹。 • Click事件。当鼠标单击文件夹时,触发Click事件,Click不会改变文件夹列表框中的当前文件夹,但它会改变文件夹列表框的ListIndex属性,因此要在Click事件中改变当前文件夹,可用以下代码实现。 • Private Sub Dir1_click() • Dir1.Path = Dir1.List(Dir1.ListIndex) • End Sub Visual Basic程序设计教程
·Keypress事件。按Windows系统的惯例,在程序中可用两种方法改变选定的路径,即用鼠标双击列表框内的某个文件夹名,或先用光标键把列表框内的光标条移到指定文件夹上,然后按回车。后一种方法的实现,必须由控件的KeyPress事件来完成。例如:·Keypress事件。按Windows系统的惯例,在程序中可用两种方法改变选定的路径,即用鼠标双击列表框内的某个文件夹名,或先用光标键把列表框内的光标条移到指定文件夹上,然后按回车。后一种方法的实现,必须由控件的KeyPress事件来完成。例如: • Private Sub Dir1_KeyPress(KeyAscii As Integer) • If KeyAscii = 13 Then • Dir1.Path = Dir1.List(Dir1.ListIndex) • End If • End Sub Visual Basic程序设计教程
12.3.3 文件列表框 • ·文件列表框用于显示当前文件夹下的文件。 • ·属性 Visual Basic程序设计教程
·常用事件 Click事件 DblClick事件 Pathchange事件 Patternchange事件 Visual Basic程序设计教程
【例12-2】设计一个如图12.4所示界面,演示了文件系统控件之间的关系。界面中驱动器、文件夹和文件列表框的名称分别【例12-2】设计一个如图12.4所示界面,演示了文件系统控件之间的关系。界面中驱动器、文件夹和文件列表框的名称分别 为Drive1、Dir1和File 1,组合框的名称为Com bo1,其Style属性为2。 文件系统控件例子 Visual Basic程序设计教程
Private Sub Form_Load() Combo1.AddItem "所有文件(*.*)" Combo1.AddItem "文本文件(*.TXT)" Combo1.AddItem "图形文件(*.bmp;*.jpg)" Combo1.ListIndex = 0 Dir1.Path = "c:\windows" End Sub 程序代码 Visual Basic程序设计教程
Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Visual Basic程序设计教程
Private Sub Combo1_Click() • If Combo1.Text = "所有文件(*.*)" Then • File1.Pattern = "*.*" • ElseIf Combo1.Text = "文本文件(*.TXT)" Then • File1.Pattern = "*.TXT" • ElseIf Combo1.Text = "图形文件(*.bmp;*.jpg)" Then • File1.Pattern = "*.bmp;*.jpg" • End If • End Sub Visual Basic程序设计教程
其中Sub Combo1_Click()内的程序代码也可以写成: • ·M=InStr(1,Combo1.Text,"(") • ·N=InStr(1,Combo1.Text,")") • ·File1.Pattern = Mid(Combo1.Text,M+1,N-M-1) Visual Basic程序设计教程
·VB提供了许多与文件操作有关的语句和函数,使用户可以在应用程序中很方便地对文件和文件夹进行删除、复制和获取文件有关属性等操作,这里简单介绍常用的几个语句。 • 1. ChDrive 语句 • 格式:ChDrive drive • 功能:改变当前驱动器。 • 示例:ChDrive "D:" 12.4 使用有关的语句和函数 Visual Basic程序设计教程
2. MkDir语句 • 格式:MkDir folder • 功能:创建一个新的文件夹,如果设置了一个无效 • 的文件夹存储路径,将会产生错误。 • 示例:MkDir "C:\TMP":MkDir "C:\TMP\ABC" Visual Basic程序设计教程
3.RmDir语句 • 格式:RmDir folder • 功能:删除一个存在的空文件夹,文件夹内不能有文 • 件。如果有文件,先用Kill语句删除所有文件。 • 示例:RmDir "C:\TMP\ABC" • 4. ChDir语句 • 格式:ChDir path • 功能:改变当前文件夹 • 示例:ChDir "C:\TMP" Visual Basic程序设计教程
5.FileCopy语句 • 格式:FileCopy source,destination • 功能:复制一个指定源文件到目标位置,用来确定 • 复制的源文件名和目标文件名,它们都可包 • 括文件的存储路径,不能复制一个已经打开 • 的文件。 • 示例:FileCopy "C:\abc.txt", "C:\TMP\bbb.txt" Visual Basic程序设计教程
6. Kill语句 • 格式:Kill file • 功能:删除指定的文件,必要时文件名应指明它的存储路 • 径。为了删除一类文件,可以使用文件通配符。 • 示例:Kill "C:\TMP\*.txt" • 7. Name语句 • 格式:Name old_name As new_name • 功能:重新命名一个文件或文件夹。Name语句具有移动文件 • 的功能,即在重新命名时并将其移动到一个不同的文 Visual Basic程序设计教程
件夹,不能重新命名一个已经打开的文件。 • 改名示例:Name "C:\TMP\bbb.txt" as "aaa.txt" • 移动示例:Name "C:\TMP\aaa.txt" as "c:\bbb.txt" 8.Shell方法 (函数) 格式:Shell command_file[,window_style]或 Shell(command_file[,window_style]) 功能:调用各种外部的可执行文件(不能调用操作系统的 各种内部命令)。 Visual Basic程序设计教程
说明:command_file用以确定要执行的外部文件的文件名 • 和目录路径。window_style为数值型表达式,用以 • 设置Shell窗口的初始状态值。该值也可使用VB系 • 统的符号常量,如表12.5所示。 • 9.CurDir函数 • 格式:CurDir ([drive] ) • 功能:返回指定盘或默认盘的当前文件夹。 • 10. FileLen函数 • 格式:FileLen(file_name) • 功能:返回是指定文件的长度,单位为字节数。 Visual Basic程序设计教程
·VB中的顺序文件是普通的文本文件,文件中的每个数据以ASCII码(文本)形式存储,因此能被不同语言的程序共享或直接打印输出,也可由文本编辑器(如记事本或EDIT等)进行修改。·VB中的顺序文件是普通的文本文件,文件中的每个数据以ASCII码(文本)形式存储,因此能被不同语言的程序共享或直接打印输出,也可由文本编辑器(如记事本或EDIT等)进行修改。 • ·顺序文件结构比较简单。它的存储方式是顺序存储,即一个数据接着一个数据地顺序排列,只是提供了第1个数据的存储位置。要查找一个数据时,必须从头开始一个一个地读取直到找到所要的数据。 12.5 操作顺序文件 Visual Basic程序设计教程
12.5.2 打开顺序文件 • 打开文件使用是Open语句,其格式为: • Open 文件名 For模式 As [#] 文件号 • 1.文件名:指定打开的文件。 • 2.模式:用于指定文件的操作方式,顺序文件共有3种操作方式,可以选择下列三种形式之一: • (1)Input:打开一个已经存在的文件作读操作。 • (2)Output:打开一个新文件作写操作,如果文件标识符指定的文件已经存在,则文件中的原内容将被清除。 Visual Basic程序设计教程
(3) Append:打开文件后在文件末尾作追加数据的写操作,如指定的文件已经存在,则文件中的原内容被保留,否则将创建一个新文件。 • 3.文件号:文件号也称通道号,是一个介于1~512之间的整型。 • 4.FreeFile函数:用来获取一个可用的最小的空闲通道号,使用格式为: FileNo=FreeFile() 或 FileNo=FreeFile0 Visual Basic程序设计教程
·例如: • ·Open "C:\TMP\ABC.DAT" For Input As 1:表示以读文件的操作模式,打开在C:\TMP路径下的名为ABC.DAT的数据文件。 • ·Open FileName For Output As FileNo:表示以写文件的操作模式,创建一个新文件,文件名及存储路径由变量FileName的值决定,通道号由变量FileNo的值决定。 Visual Basic程序设计教程
12.5.3 写入操作 • 1. Write # 语句。将表达式的值写入与文件号相关的顺序文件。使用格式如下。 • Write #文件号,[输出表达式列表] Visual Basic程序设计教程
(1)输出表达式列表的各表达式间可用逗号(,)或分号(;)分隔,两种分隔符的效果相同。(1)输出表达式列表的各表达式间可用逗号(,)或分号(;)分隔,两种分隔符的效果相同。 • (2)自动在写入文件的各输出项之间,加入分隔符逗号“,”;字符类型输出项以双引号作为界限符;写入文件的逻辑型、日期型数据或空值(NULL),是以#号作为数据项的界限符,如#TRUE#、#FALSE#、#1999-10-30#、#NULL#。 Visual Basic程序设计教程
(3)最后一个输出项的后面如果没有逗号或分号,将自动追加回车换行符。(3)最后一个输出项的后面如果没有逗号或分号,将自动追加回车换行符。 • (4)如果语句中没有任何输出项即只有通道号及后面的逗号,将向文件中输出一个空行。 Visual Basic程序设计教程
【例12-3】 利用Write # 语句把数据写入文件 • Private Sub Form_Click() • Dim nn As Integer, cc As String • Open "d:\temp.txt" For Output As #1 • nn = 123: cc = "ABCDE" • Write #1, nn * 2, 5 > 3 • Write #1, cc, • Write #1, "hello" • Write #1, • Write #1, #03/01/2001# • Close #1 • End Sub Visual Basic程序设计教程
2. Print # 语句。它是一种格式化的文件输出语句,其数据输出格式与Print方法在窗体上输出的格式类似。使用格式如下。 • Print #文件号,[输出表达式列表] • 它与Write # 语句的区别在于,Print # 语句完全按程序代码中设定的格式输出数据。其中输出表达式列表的各输出项之间及语句末尾,可用逗号或分号分隔,它们的分隔效果不同(关请参见2.7.3)。 Visual Basic程序设计教程
12.5.4 关闭顺序文件 • · 结束各种读写操作以后,必须将打开的文件关闭,否则将会造成数据丢失。 • · 关闭文件的语句格式为: Close [[#]文件号[,[#]文件号]...] Visual Basic程序设计教程
·在完成了数据文件的写操作后,当VB程序执行到Close语句,则在关闭并释放文件缓冲区前,会在把缓冲区中的数据写入磁盘后再执行关闭操作,同时释放内存空间。·在完成了数据文件的写操作后,当VB程序执行到Close语句,则在关闭并释放文件缓冲区前,会在把缓冲区中的数据写入磁盘后再执行关闭操作,同时释放内存空间。 • ·当VB程序执行到End语句或单击窗体关闭按钮时,也会关闭此时尚未关闭的文件。 Visual Basic程序设计教程
12.5.5 读出操作 • ·要把数据从顺序文件中读出,应该以Input模式打开文件,然后使用Input # 、Line Input #语句或Input函数从文件中读出数据。通常Input用来读出由Write写入的数据,Line Input和Input函数用来读出由Print写入的数据。 Visual Basic程序设计教程
·1. Input # 语句。从指定的文件中读出数据项,并把它们存入各自的变量中。使用格式为: Input #文件号,变量列表 其中,变量名列表中的变量个数决定了该语句从文件中读取的数据个数。例如,语句: Input #1,nn%,cc$,dd Visual Basic程序设计教程
·2. Line Input # 语句。 • 仅以回车换行符(Chr(13)+Chr(10))作为界限,从文件中读入一整行的字符,并赋予相应的字符型变量。使用格式为: Line Input #文件号, 字符型变量 Visual Basic程序设计教程
·3.Input函数。从文件中读取指定字符数的字符。使用格式为:·3.Input函数。从文件中读取指定字符数的字符。使用格式为: Input(字符数,#文件号) 例如b$=Input(10,#1)表示从文件号为1的顺序文件中读出10个字符。 Visual Basic程序设计教程
·4. EOF函数。判断是否已读完了文件中的所有数据(即已到了文件末尾)。使用格式为: EOF(文件号) 如果指定的文件已经读到了文件末,则函数返回True,否则返回False。 Visual Basic程序设计教程
·5.LOF函数。获取已打开文件的总字节数。如果返回0,表示文件为空。使用格式为:·5.LOF函数。获取已打开文件的总字节数。如果返回0,表示文件为空。使用格式为: LOF(文件号) 例如Text1.text=Input(LOF(1),1)表示把文件号为1的文件内容全部读出显示在文本框中。 Visual Basic程序设计教程
【例12-4】利用EOF函数,统计已打开的某文件中的数据个数,通道号为1,统计结果显示在Text1文本框内。其中文件打开和关闭在窗体的Load和UnLoad事件中完成。【例12-4】利用EOF函数,统计已打开的某文件中的数据个数,通道号为1,统计结果显示在Text1文本框内。其中文件打开和关闭在窗体的Load和UnLoad事件中完成。 Visual Basic程序设计教程
Private Sub Command1_Click() • Dim Numb as Integer,ntt as String • Numb = 0 • Do While Not EOF(1) • Input #1, ntt • Numb = Numb + 1 • Loop • Text1.Text = Str(numb) • End Sub Visual Basic程序设计教程
【例12-5】设计一个应用程序,界面如图图12.6所示。利用窗体输入若干位同学的姓名和计算机成绩,并将它存入文件【例12-5】设计一个应用程序,界面如图图12.6所示。利用窗体输入若干位同学的姓名和计算机成绩,并将它存入文件 • 中。要求操作过程为 • :先击“保存”按钮 • cmdSave ,决定要保 • 存的文件;然后在两 • 文本框txtName和txtScore中输入姓名和成绩,击“添加”按钮cmdAdd将数据送入文件;击“退出”cmdExit关闭文件,并结束程序运行。 Visual Basic程序设计教程
Private Sub Form_Load() • cmdAdd.Enabled = False • End Sub • Private Sub cmdSave_Click() • Dim Fname as String • cdl_1.ShowSave Fname = cdl_1.FileName • If Trim(cdl_1.FileTitle) <> "" then • Open Fname For Output As #1 • cmdAdd.Enabled = True • cmdSave.Enabled = False • Else • Msgbox "必须选择一个文件" • End if • End Sub Visual Basic程序设计教程
Private Sub cmdAdd_Click() '向文件添加数据 • If Trim(txtName.Text) <> "" Then • Write #1, Trim(txtName.Text), Val(txtScore.Text) • End If • txtName.Text = "" :txtScore.Text = "" • txtName.SetFocus • End Sub • Private Sub cmdExit_Click() ' • Close #1 • Unload Me • End Sub Visual Basic程序设计教程
【例12-6】利用例12.5输入的数据,在窗体的文本框txtContent中显示所有同学的姓名和计算机成绩,并求出班平均分显【例12-6】利用例12.5输入的数据,在窗体的文本框txtContent中显示所有同学的姓名和计算机成绩,并求出班平均分显 • 示在文本框txtAverAge中 • 。设计界面如图所示。 Visual Basic程序设计教程
Private Sub cmdShow_Click() • Dim Sum as Integer,Count as Integer,Name as String, Score as Integer • cdl_1.ShowOpen • if cdl_1.FileTitle <> "" then • Open cdl_1.FileName For Input As #1 • Else • Msgbox "必须打开文件" • Exit sub • End if • Sum = 0: Count = 0 Visual Basic程序设计教程
Do While Not EOF(1) • Input #1, Name, Score • txtContent.Text = txtContent.Text & Name & Score • txtContent.Text = txtContent.Text & Chr(13) & Chr(10) '显示信息后换行 • Sum = Sum + Score • Count = Count + 1 '统计人数 • Loop • txtAverage = Sum / Count • Close #1 • End Sub Visual Basic程序设计教程