第 10章 文件
10.1 文件的结构和分类
10.2 文件操作语句和函数
10.3 顺序文件
10.4 随机文件
10.5 文件系统控件
10.6 文件基本操作引例
10.1.1 文件文件 是指存储在计算机外部存储器上经过格式化的数据的集合。
10.1 文件和文件分类
10.1.2 文件分类
根据数据文件存储 数据的性质 分类,分为 程序文件,数据文件 。
根据文件的 存取方式和结构 分类,分为 顺序文件,随机文件 。
根据文件数据的 编码方式 分类,分为 ASCII码文件 和 二进制文件 。
VB中按文件的访问方式不同,将文件分为 顺序文件,随机文件 和 二进制文件 。后续几节将主要介绍顺序文件和随机文件的访问操作方法。
顺序访问和随机访问文件方式侧重的文件数据类型不尽相同,但它们访问文件的基本步骤相同,都是下列三种操作步骤:
10.2 文件操作语句和函数
(1) 使用 Open语句打开文件,同时指定文件的文件号。
(2) 从文件中读取数据到内存变量或向文件中写入数据。
(3) 使用 Close语句关闭文件。
程序数据区缓冲区内存磁盘文件读文件写文件
10.2.1 文件的打开
Open "文件名 " [For 访问模式 ] As [#]文件号 [Len=记录长度字节数 ]
文件名,必选参数,指定文件名,还可包括驱动器、目录。
访问模式,可选参数,指定文件访问方式。
打开顺序文件,有 Input,Output,Append三种模式
Input:打开一个顺序文件进行读操作。
Output:打开一个顺序文件进行写操作。文件若不存在,则新建;文件存在则打开,覆盖原来内容。
Append:追加模式。文件若存在,则打开,写入的数据添加在原有数据末尾;文件若不存在,则新建之。
打开随机文件,为 Random或省略文件号,必选参数,是给打开的文件分配一个文件号,范围在 1到
511之间。
记录长度字节数,可选参数。是一个小于或等于 32767字节的数。
对于随机文件,该值即记录长度。对于顺序文件,该值是缓冲字符数,指定进行数据交换时数据缓冲区的大小。
10.2.2 文件的读写相关函数
EOF( #文件号),用于判断当前文件指针是否到达文件尾。若到达,函数值为 True,否则为 False。
FreeFile[(范围参数 )]:返回一个整数,代表下一个可供 Open语句使用的文件号(即未被其它文件占用的文件号)。范围参数可选,
指定一个范围,以便返回该范围之内的下一个可用文件号。指定
0(缺省值)则返回一个介于 1~255之间的文件号。指定 1则返回一个介于 256~511之间的文件号。
例如:
Dim FileNumber As Integer
FileNumber = FreeFile '取得未使用的文件号。
Open "myfile" For Output As #FileNumber '创建或打开文件进行写操作。
Close #FileNumber '关闭文件。
LOF( #文件号),返回用 Open语句打开的文件的字节数,若是空文件则函数值为 0。对于尚未打开的文件,可使用 FileLen(文件名 )函数计算其长度。
例如:
Dim FileLength As Long
Open "File1.dat" For Input As #1 '打开文件进行读操作。
FileLength = LOF(1) '调用 LOF函数计算文件长度。
Close #1
10.2.3 文件的关闭对文件进行完各种操作之后,必须关闭。
Close [文件号列表 ]
文件号列表:代表一个或多个文件号。若省略,表示关闭 Open语句打开的所有文件。
例如:
Close 1 '关闭文件号为 1的文件
Close 1,2 '关闭当前已打开的文件号为 1和文件号为 2的文件
Close '关闭所有打开的文件注意,文件关闭后,与其原文件号不再关联,该文件号可分配给其它文件使用。
10.3.1 顺序文件的读操作( Input和 Line Input)
顺序文件是指文件中的记录连续存放,记录长短可不同,访问时只能依顺序从第一条记录访问到最后一条记录。顺序文件的访问方式适合访问普通的文本文件,如文字处理软件 WPS,WORD、
或写字板等创建的文本文件。
当文件以 Input模式打开,就可以对文件进行顺序读操作。
例如:
10.3 顺序文件的读写
Open "File1.dat" For Input As #1 '打开文件以便进行读操作
Input #1,Name,SerialNumber '将数据读入变量 Name和
SerialNumber
VB提供的读取文件内容的方法有以下三种:
( 1)从已经打开的顺序文件中读出数据并将数据赋给变量。
语法格式,Input #文件号,变量列表其中变量列表以逗号分隔,从文件中读出的值分别赋给这些变量。
注意:
① 文件中数据项目的顺序必须与变量列表中变量的顺序相同,数据类型必须和变量列表中变量的数据类型匹配。
② 这些变量不可是一个数组或对象变量。
③ 用 Input # 语句只能读用 Write # 语句(而不是 Print # 语句)写入的数据文件。因为 Write # 语句可以确保将各个单独的数据域正确分隔开。
例如,Dim c1,c2
Open "myfile" For Input As #1 '打开输入文件。
Input #1,c1,c2 '将数据读入两个变量。
Debug.Print c1,c2 '在立即窗口中显示数据。
Close #1 '关闭文件。
( 2)从文件中读出指定数目的字符。
语法格式,Input(读取的字符数,#文件号)
Input函数返回它所读出的所有字符,包括逗号、回车符、空白列、
换行符、引号和前导空格等。
例如:
Dim c
Open "myfile" For Input As #1 '打开文件。
c = Input(1,#1) '读入一个字符并将其赋予变量 c
Close #1 '关闭文件。
Dim line1 As String
Open "myfile" For Input As #1 '打开文件。
Do While Not EOF(1)
Line Input #1,line1 '读入一行数据并将其赋予变量 line1。
Debug.Print line1 '在立即窗口中显示数据。
Loop
Close #1 '关闭文件。
( 3)从已经打开的顺序文件中读出一行字符,直到遇到回车符
( chr(13))或回车换行符( chr(13)+chr(10))为止。回车、换行符将被跳过,而不会被附加到字符串上。
语法格式,Line Input #文件号,变量其中变量为 String型或 Variant型。
例如:
10.3.2 顺序文件的写操作( Print 和 Write )
如果文件是以 Output或 Append模式打开的,就可以对文件进行顺序写操作。
( 1)将格式化显示的数据写入顺序文件中。
语句格式,Print #文件号,[数值或字符串表达式 ]
数值或字符串表达式为可选参数,如果有一个以上的表达式,
可以用逗号分隔;如果不带这个参数,并在文件号后加上逗号,表示向文件中写入一空白行。
例如:
Open "printdatafile" For Output As #1 '打开要写入数据的文件
Print #1,'写入空白行
Print #1 "Print语句 " '写入文本 "Print语句 "
( 2)将数据写入顺序文件。
语句格式,Write #文件号,[数值或字符串表达式 ]
数值或字符串表达式为可选参数,如果不带这个参数,并在文件号后加上逗号,表示向文件中写入一空白行。
与 Print # 语句不同,当要将数据写入文件时,Write # 语句采用紧凑格式以逗号分隔数据项目,以双引号标记字符串。 Write
# 语句在将数据写入文件后自动插入 Chr(13)+Chr(10),即回车换行。通常用 Input # 语句从文件读出 Write # 语句写入的数据。
例如:
注意:
对于顺序文件的访问,读与写要分别用不同的方式打开文件
( For Input“读”,For Output或 For Append对应不同方式的
“写”)。 例 10_3_1
Open "writedatafile" For Output As #1 '打开要写入数据的文件
Write #1,"Write语句 ",89 '写入以逗号隔开的数据
Write #1,'写入空白行例 10-1顺序文件读写。
新建一个工程,窗体 Form1如图 10-1,包括一个文本框,三个命令按钮。单击“新建”按钮实现新建一个顺序文件
c:\serialfile.txt。单击“打开”按钮可以打开该文件并在文本框中显示其内容;如果该文件不存在,可提示错误如图 10-2,选择“确定”返回 Form1窗体;如果重新选择“新建”可建立该文件。单击“退出”按钮结束程序运行。
图 10-1 顺序文件读写示例 图 10-2 错误提示错误处理
1,On Error 语句
On Error GoTo 语句标号
On Error Resume Next ‘ 运行后面的语句
On Error GoTo 0 ‘禁止当前过程任何已启动的错误处理程序
2,Err对象常用属性有:
Err.Number 返回或设置错误代码(缺省属性)
Err.Description 错误信息
Err.source 哪个对象产生错误如 p195
if Err <> VBCancel
then
随机文件由相同结构、相同长度的记录组成,每条记录可包含一个或多个字段。每条记录都有一个记录号。
[Private | Public] Type 自定义类型名成员名 As 类型
[成员名 As 类型 ]
……
End Type
10.4 随机文件
10.4.1 随机文件的读写操作对随机文件的存取是以 记录 为单位进行的,所以在对随机文件进行读写访问之前,应先定义一个记录类型。在程序的变量声明部分定义记录类型。
语法格式为:
定义这种类型的变量。
例如:
Dim MySubject As Subject ‘定义 MySubject 为 Subject类型的变量如下声明一个课程的记录类型:
Type Subject
Name As String * 20 '课程名称宽度为 20字节
Term As Integer '授课学期为整型
Number As Integer '课程学时为整型
End Type
随机文件的 读取 采用 Get语句。
语法格式,Get [#]文件号,[记录号 ],变量其中,记录号可选,若提供记录号,则表示从此记录号处开始读出数据;若缺省,表示读取的是当前记录的后一条记录。变量为必选参数,读出的数据将写入其中。通常用 Get语句将 Put语句写入的文件数据读出来。
例如:
Dim Position As Integer
Open "c:\temp\subject.txt" For Random As #1 Len =
Len(MySubject)
Position = 2
Get #1,Position,MySubject '读取第二条记录
Close 1
随机文件的写入采用 Put方法。
语法格式,Put [#]文件号,[记录号 ],变量其中,记录号可选,若提供记录号,则表示从此记录号处开始写入数据,这时,若写入的记录号已存在,原来的记录将被覆盖;如果不存在,则系统自动增加文件长度,直到使得该记录号存在。若缺省记录号,则表示从当前记录的下一条开始写入。
变量为必选参数,包含要写入磁盘的数据的变量名。
例如:
MySubject.Name = "VB程序设计 " ’课程名称 = "VB程序设计 "
MySubject.Term = 2 ’ 授课学期 = 2
MySubject.Number = 64 ’ 课程学时 = 64
Put #1,5,MySubject ’ 将记录写入文件的第 5条记录位置
10.4.2 随机文件中记录的增加与删除使用 Open语句打开随机文件,如果该文件不存在,可以新建该文件。使用 Put语句可向打开的随机文件末尾增加新的记录。
例 10-2向随机文件 subject.txt( c:\temp目录下)中添加记录。窗体及各控件属性如表 10-2。
表 10-2 窗体控件及属性程序运行界面如图 10-4所示。如果随机文件中还没有任何记录,文本框 TxtName,TxtTerm及 TxtNum均显示文本为空;
否则显示当前文件最后一条记录。当单击“添加”按钮时,清空 TxtName,TxtTerm和 TxtNum的内容,可以在这三个文本框中分别输入课程名称、授课学期和课程学时。单击“保存”按钮可保存该条记录。单击“取消”按钮可取消添加。
图 10 - 4 随机文件增加记录思考,如何向随机文件指定位置插入记录?
例 10-3从随机文件 subject.txt中删除指定记录。
从随机文件 subject.txt中删除指定记录,可以采取给指定记录做删除标记,或者将后续记录向前移动覆盖该条需删除的记录并将最后一条记录清空。但是第一种方式删除的记录仍在文件中,第二种方式虽然删除了指定记录,但最后一条记录仍然存在,只是内容为空。
要从随机文件 subject.txt中彻底删除记录,可采取将文件中无需删除的记录写入另外一个文件 subject2.txt,再将 subject2.txt
文件中内容拷贝回 subject.txt实现。窗体及各控件属性如表 10-3;
程序界面设计如图 10-5所示。
图 10-5删除随机文件记录程序运行,在文本框 Text1中输入要删除的记录号 8,单击“显示”
按钮,TxtName,TxtTerm,TxtNum文本框将分别显示第八条记录的课程名称、授课学期和课程学时。如果需要删除该条记录可单击“删除”按钮,将出现如图 10-6所示的消息框,按“确定”可删除这条记录,按“取消”则取消删除。如果输入的记录号不在
1~记录总数范围内,将出现如图 10-7所示的消息框提示错误。
图 10-7 无效数据图 10-6 警告删除
10.4.3 用控件浏览和修改随机文件对随机文件,以 Get语句读出记录,进行修改后,再用 Put语句重新写入文件。
例 10-4利用滚动条浏览随机文件,可保存对记录进行的修改或取消修改。
程序运行界面如图 10-8。移动滚动条,在 TxtName,TxtTerm、
TxtNum文本框中显示记录相应内容,单击“修改”按钮可以对文本框中内容进行修改;单击“保存”,保存修改后的记录;单击
“取消”则取消对记录的修改,在文本框中显示记录原来的内容。
图 10-8 用控件显示和修改随机文件特别提示:
对比顺序文件的访问,对随机文件而言,读与写所用的打开文件方式是一样的(都是 For Random)。而对于顺序文件的访问,读与写却要分别用不同的方式打开文件( For Input为“读”,For Output或 For Append对应不同方式的“写”)。
VB为用户进行文件操作提供了两种方式。一种是使用前面已经介绍过的 CommonDialog控件所提供的标准对话框。另外一种就是使用文件系统控件:驱动器列表框( DriveListBox)、目录列表框( DirListBox)和文件列表框( FileListBox)。
10.5.1 驱动器列表框用来显示和选择用户系统中所有磁盘驱动器。
Drive属性,用于设置在列表框中显示的当前工作驱动器。该属性不能从属性窗口中静态设置,只能在程序中用代码进行设置,或者在程序运行时双击列表框中某个驱动器改变 Drive属性。
Drive属性设置格式为:
<对象 >.Drive [=<驱动器名 >]
对象:是指定的 DriveListBox控件的名称。
驱动器名:是指定的驱动器盘符字符串(如 "C:"等)。
Change事件,在程序运行时,选择一个新的驱动器或通过代码改变驱动器列表框的 Drive属性的设置时,都会触发驱动器列表框的 Change事件发生。如果选择不存在的驱动器,则产生错误。
10.5 文件系统控件制作
10.5.2 目录列表框在窗体中添加目录列表框控件,以便当程序运行时显示当前驱动器上的目录列表。目录列表包括当前驱动器根目录及其子目录结构。
Change事件,与驱动器列表框一样,在程序运行时,每当改变当前目录,即目录列表框的 Path属性发生变化时,都要触发其
Change事件发生。
Path属性,用于设置或返回列表框中显示的当前工作目录。同驱动器列表框的 Drive属性一样,不能从属性窗口中静态设置,只能在程序中用代码进行设置;或者在程序运行时双击列表框中某个目录改变 Path属性。 Path属性设置格式为:
<对象 >.Path [=<路径 >]
对象:是指定的 DirListBox控件的名称。
路径:是指定的目录字符串(如 "C:\Windows")。
制作
10.5.3 文件列表框文件列表框控件 FileListBox用来显示在 Path 属性指定的文件夹中所选择文件类型的文件列表。
文件列表框的基本属性包括 Patter,Filename,Path等属性。
Path属性,返回或设置当前路径,用于存放指定目录下的文件。
不能在属性窗口设置,只能在程序中设置。设置格式为:
<对象 >.Path [=路径 ]
对象:是指定的 FileListBox控件的名称。
路径:即指定的当前目录字符串(如 "D:\Microsoft Office\")。
Pattern属性,用来设置在执行时要显示的文件类型,可以在属性窗口设置,也可在程序代码中设置。设置格式为:
<对象 >.Pattern [=<值 >]
对象:是指定的 FileListBox控件的名称。
值:是一个用来指定文件类型的字符串表达式,如缺省情况下为 "*.*",指所有文件;若指定值为 "*.Doc",则表示只显示 Word
文档文件;如此类推。 制作
Filename属性,用来返回或设置所选文件的路径和文件名 (即 带路径的文件名 )。不能在属性窗口设置,只能在程序中进行设置,或者在程序运行时双击列表框中某项来改变。设置格式为:
<对象 >.FileName [=带路径的文件名 ]
对象:是指定的 FileListBox控件的名称。
带路径的文件名:是包含指定文件路径和文件名的字符串(如
"C:\Winnt\Calc.exe")。
显示图片例
10.5.4 三种文件系统列表框协同工作的程序根据程序需要,在窗体上可以设计驱动器列表框、目录列表框和文件列表框。这三个控件之间在设计之初是相互独立的,要使三者关联而发生联动,必须在程序中编写驱动器列表框 Change事件和目录列表框 Change事件代码。
例 10-5驱动器列表框、目录列表框、文件列表框协同工作按某种文件类型显示文件列表。
( 1)新建一个窗体,设置 Caption属性为文件系统控件例。
( 2)在窗体中添加控件,包括标签 Label1、文本框 Text1、驱动器列表框 Drive1、目录列表框 Dir1、文件列表框 File1和两个命令按钮。
程序运行,在文本框中输入文件类型,如,*.txt,选择驱动器及目录,点击显示按钮将显示所有该目录下 txt文件。
如图 10-12。
图 10-12文件系统控件
10.6.1 删除文件命令删除指定文件。文件名中可使用多字符( *)和单字符(?)通配符来表示删除多个文件。
命令格式,Kill 文件名例如:
Kill "c:\myfile.txt" '删除 c:\myfile.txt。
Kill "d:\datafile\*.txt" '将 d:\datafile目录下所有 *.txt文件全部删除。
10.6.2 文件复制命令复制一个文件。
命令格式,FileCopy 源文件 目标文件例如:
FileCopy "c:\srcfile.txt","c:\objfile.txt" '将 c:\srcfile.txt复制为
c:\objfile.txt
FileCopy "c:\srcfile.txt","d:\objfile.txt" '将 c:\srcfile.txt复制为
d:\objfile.txt
10.6 文件基本操作
10.6.3 文件(夹)重命名命令对文件或文件夹重命名。使用 Name语句重新命名文件并可以将其移动到一个不同的文件夹中,Name可跨驱动器移动文件。但
Name语句不能创建新文件或文件夹。不能使用通配符。 Name语句重新命名文件夹时不能将改名的文件夹移到另一个驱动器。
命令格式,Name 源文件(夹)名 As 新文件(夹)名例如:
Name "c:\oldfile.txt" As "c:\newfile.txt" '更改文件名。
Name "c:\oldfile.txt" As "c:\temp\newfile.txt" ' 将文件 c:\oldfile.txt
移动到 ' c:\temp,并更改文件名为 newfile.txt
Name "e:\aaa" As "e:\xxx" ' 将 e:盘根目录下的文件夹名 "aaa"改名为 "xxx"