第五章 文件本章内容及要求:
1 掌握文件系统控件(驱动器列表框 drvDrive、目录列表框 dirDirectory、文件列表框 filFile。
2 掌握 VB中文件的概念、种类及其结构;
3 掌握顺序文件的操作:打开、读 /写、关闭;
4 了解随机文件的操作:打开、读 /写、关闭;
5 了解二进制文件的操作。
6 了解使用 FileSystem Object (FSO) 对象模型对文件进行操作的一些基础知识本章重点:
1 文件系统控件驱动器列表框、目录列表框、文件列表框的使用。
2 顺序文件的操作:打开、读 /写、关闭;
本章难点:
随机文件、二进制文件的操作,FileSystem
Object (FSO) 对象模型。
教学方法:
9.1 文件的概念一、文件及其结构文件,存储在外部介质上数据的集合。按名存取磁盘文件是由数据记录组成 。记录是计算机处理数据的基本单位,它由一组具有共同属性相互关联的数据项组成。
学号 姓名 数学成绩 语文成绩 物理成绩 总分数据项记录 1 记录 2 记录 N 文件结束标志二、文件分类根据访问文件的方式将文件分成 3类:
顺序文件
随机文件
二进制文件。
1,顺序文件顺序文件( Sequential File)是普通的文本文件。顺序文件中的记录按顺序一个接一个地排列。读写文件存取记录时,都必须按记录顺序逐个进行。 一行一条记录(一项数据),记录可长可短,以“换行”字符为分隔符号。
#1 记录 1 #2 记录 2 #N 记录 N
2,随机文件随机文件( Random Access File) 是可以按任意次序读写的文件,其中每个记录的长度必须相同。在这种文件结构中,
每个记录都有其唯一的一个记录号,所以在读取数据时,只要知道记录号,便可以直接读取记录。
随机文件的文件结构
3,二进制文件二进制文件( Binaryfile)是字节的集合、它直接把二进制码存放在文件中。
除了没有数据类型或者记录长度的含义以外,它与随机访问很相似。
二进制访问模式是以字节数来定位数据,在程序中可以按任何方式组织和访问数据,对文件中各字节数据直接进行存取。
9.2 文件系统控件
VB提供了 3种可直接浏览系统目录结构和文件的控件:
驱动器列表框、目录列表框、文件列表框。
驱动器列表框文件列表框目录列表框
9.2.1 驱动器列表框( DriveListBox)
驱动器列表框( DriveListBox) 控件,通常只显示当前驱动器名称,单击向下箭头,就会下拉出计算机拥有的所有磁盘驱动器,供用户选择。
1.重要属性
Drive属性 是驱动器列表框控件最重要和常用的属性,该属性在设计时不可用 。
使用格式:
object.Drive [= <字符串表达式 >]
例如,Drive1.drive=“D:”
2.重要事件 ——Change事件在程序运行时,当选择一个新的驱动器或通过代码改变
Drive属性的设置时都会触发驱动器列表框的 change事件发生 。
9.2.2 目录列表框( DirListBox)
目录列表框( DirListBox)
控件用来当前驱动器目录结构及当前目录下的所有子文件夹(子目录)。供用户选择其中一个目录为当前目录。
1,常用属性
Path属性 是目录列表框控件的最常用的属性,用于返回或设置当前路径 。 该属性在设计时是不可用的 。
使用格式,Object.Path [= <字符串表达式 >]
其中:
Object:对象表达式,其值是目录列表框的对象名 。
<字符串表达式 >:用来表示路径名的字符串表达式。
例如,Dir1.Path=" C:\Mydir"。
缺省值是当前路径。
说明,Path属性也可以直接设置限定的网络路径如,\\网络计算机名 \共享目录名 \path
List,ListCount 和 ListIndex等属性,这些属性与列表框 ( ListBox) 控件基本相同 。
目录列表框中的当前目录的
ListIndex 值为 -1。紧邻其上的目录具有 ListIndex 值为 -2,再上一个的 ListIndex值为 -3,如右图所示。
2,重要事件 ——Change事件与驱动器列表框一样,在程序运行时,每当改变当前目录,即目录列表框的 Path属性发生变化时,都要触发其
Change事件发生。
文件列表框( FileListBox) 控件用来显示 Path 属性指定的目录中的文件定位并列举出来。该控件用来显示所选择文件类型的文件列表。
9.2.3 文件列表框( FilelistBox)
1,常用属性
( 1) Path属性用于返回和设置文件列表框当前目录,设计时不可用。
说明:当 Path值的改变时,会引发一个 PathChange事件 。
此条件也可改为,Len(file1.path)>3
( 2) Filename属性用于返回或设置被选定文件的文件名,设计时不可用 。
说明,Filename属性不包括路径名 。
例如,要从文件列表框 ( File1) 中获得全路径的文件名
Fname$,用下面的程序代码:
If Right(file1.path,1) ="\" Then
Fname$=file1.path & file1.filename
Else
Fname$=file1.path & "\" & file1.filename
End If
( 3) Pattern属性用于返回或设置文件列表框所显示的文件类型 。 可在设计状态设置或在程序运行时设置 。 缺省时表示所有文件 。
设置形式为,Object.Pattern [= value]
其中 value是一个用来指定文件类型的字符串表达式,并可使用包含通配符 (,*” 和,?,)
例如:
File1.Pattern= "*.txt "
File1.Pattern= "*.txt; *.Doc,
File1.Pattern= ".txt“
注意,要指定显示多个文件类型,使用,;”为分隔符重新设置 Pattern属性引发,PatternChange”事件 。
( 4)文件属性:
Archive,True,只显示文档文件;
Normal,True,只显示正常标准文件;
Hidden,True,只显示隐含文件;
System,True,只显示系统文件。
ReadOnly,True,只显示只读文件。
( 5) MultiSelect 属性文件列表框 MultiSelect 属性与 ListBox控件中 MultiSelect 属性使用完全相同。默认情况是 0,即不允许选取多项。
( 6) List,ListCount 和 ListIndex 属性文件列表框中的 List,ListCount 和 ListIndex 属性与列表框 ( ListBox) 控件的 List,ListCount 和 ListIndex 属性的含义和使用方法相同,在程序中对文件列表框中的所有文件进行操作,就有用到这些属性 。
例如,下段程序是将文件列表框 ( File1) 中的所有文件名显示在窗体上 。
For i = 0 To File1.ListCount - 1
Print File1.List(i)
Next i
2,主要事件
( 1) PathChange事件当路径被代码中 FileName或 Path属性的设置所改变时,
此事件发生 。
说明,可使用 PathChange事件过程来响应 FileListBox控件中路径的改变 。 当将包含新路径的字符串给 FileName属性赋值时,FileListBox控件就调用 PathChange事件过程 。
( 2) PatternChange事件当文件的列表样式,如,"*.*",被代码中对 FileName
或 Path属性的设置所改变时,此事件发生 。
说明,可使用 PatternChange事件过程来响应在
FileListBox控件中样式的改变。
( 3) Click,DblClick事件:
例如:单击输出文件名。
Sub filFile_Click( )
MsgBox filFile.FileName
End Sub
例如:双击执行可执行程序
Sub File1_DblClick( )
Dim Fname As String
If Right(file1.path,1) ="\" Then
Fname=file1.path & file1.filename
Else
Fname=file1.path & "\" & file1.filename
End If
RetVal = Shell(Fname,1) ' 执行程序
End Sub
Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub Sub Dir1_Change()filFile.Path = Dir1.Path
End Sub
说明,要使驱动器、目录和文件列表框同步显示,那么就需要编写代码才能使它们之间彼此同步。
9.2.4 文件系统控件的联动。
打开文件 读出或写入 关闭文件
9.3 顺序文件在程序中对文件的操作,通常按 3个步骤进行:
9.3.1 顺序文件的打开与关闭
1。 打开顺序文件其使用格式如下:
Open FileName For [Input | Output | Append] [Lock]As
filenumber[Len = Buffersize]
各参数的意义 (见教材 Pg,230)
例如:
OPEN,C:\TEMP\A.TXT,FOR Input AS #1
OPEN“C:\TEMP\B.TXT,FOR Output AS #2
OPEN“C:\TEMP\C.TXT,FOR Append AS #1
2,关闭文件 ——Close 语句使用格式如下:
Close [filenumberlist]
其中:
filenumberlist:可选项,为文件号列表,如,#1,#2,#3,如果省略,则将关闭 Open语句打开的所有活动文件 。
例如,Close #1,#2,#3
Close
9.3.2 顺序文件的读写操作向文件写入内容使用 Print # 语句或 Write#语句,在程序是数据输出 。
1,Print语句使用格式,PRINT #<文件号 >,[<输出列表 >]
说明,文件号为以写方式打开文件的文件号;
输出列表为用分号或逗号分隔的变量,常量,空格和定位函数序列 。
2,Write命令使用格式,Write #<文件号 >,[<输出列表 >]
Write语句采用紧凑格式 。 数据项之间插入,,”,并给字符数据加上双引号 。
例 9.1 Print与 Write语句输出数据结果比较。
Private Sub Form_Click()
Dim Str As String,Anum As Integer
Open "D:\Myfile.dat" For Output As 1
Str = "ABCDEFG"
Anum = 12345
Print #1,Str,Anum
Write #1,Str,Anum
Close #1
End Sub
例 9.2 编程把一个文本框中的内容,以文件形式存入磁盘。
假定文本框的名称为 Mytxt,文件名为 Myfile.dat。
方法 1,把整个文本框的内容一次性地写入文件 。
Open "Myfile.dat" For Output As #1
Print #1,Mytxt.Text
Close #1
方法 2,把整个文本框的内容一个字符一个字符地写入文件 。
Open "Myfile.dat" For Output As #1
For i=1 To len(Mytxt.Text)
Print #1,Mid(Mytxt.Text,i,1);
Next i
Close #1
2,顺序文件读操作从现存文件中读入数据,应以顺序 Input方式打开该文件。然后使用 Input# 语句,Line Input#
语句和 Input( )函数读入到程序变量中。
使用格式如下:
INPUT #文件号,变量列表把读出的每个数据项分别存放到所对应的变量。
LINE INPUT #文件号,字符串变量读一行到变量中,主要用来读取文本文件。
INPUT$(读取字符数,#文件号 )
读取指定的数量的字符,作为函数的返回值。
3.与读文件操作有关的几个函数
( 1) Lof 函数
LOF函数将返回某文件的字节数 。 例如,LOF(1)返回 #1
文件的长度,如果返回 0值,则表示该文件是一个空文件 。
( 2) Loc 函数
Loc函数将返回在一个打开文件中读写的记录号;对于二进制文件,它将返回最近读写的一个字节的位置 。
( 3) Eof 函数
Eof 函数将返回一个表示文件指针是否到达文件末尾的标志。如果到了文件末尾,Eof 函数返回 TRUE(-1),否则返回 FALSE(0)。
例 9.3 编程将一文本文件的内容读到文本框假定文本框名称为 txtTest,文件名为 MYFILE.TXT。可以通过下面三种方法来实现。
方法 1,一行一行读
txtTest.Text = ""
Open "MYFILE.TXT" For Input As #1
Do While Not EOF(1)
Line Input #1,InputData
txtTest.Text = txtTest.Text + InputData+vbCrLf
Loop
Close #1
回车换行方法 2,一次性读
txtTest.Text = ""
Open "MYFILE.TXT" For Input As #1
txtTest.Text = Input( LOF(1),1)
Close #1
方法 3,一个个字符读
Dim InputData as String*1
txtTest.Text = ""
Open "MYFILE.TXT" For Input As #1
Do While Not EOF(1)
Input #1,InputData
txtTest.Text = txtTest.Text + InputData
Loop
Close #1
例 9.4 利用文件系统控件、组合框、文本框,制作一个文件浏览器。
要求,组合框限定文件列表框中显示文件的类型,如选定,*.Txt”文件。当在文件列表框选定欲显示的文件时,在文本框显示出该文件的内容。
程序运行效果如图
9.4 随机文件
9.4.1 随机文件的打开与关闭
1,打开随机文件打开随机文件格式为:
OPEN FileName FOR Random [Access <Mode>][Lock] As
filenumber [Len = reclength]
用 OPEN命令以 Random模式打开随机文件,同时指出记录的长度。文件打开后,可同时进行读写操作。
例如:
Open "d:\abc.dat" For Random Access Read As
#1 Len = 20
2,关闭随机文件随机文件的关闭与关闭顺序文件相同 。
9.4.2 写随机文件
Put [#]文件号,[记录号 ],变量名将一个记录变量的内容写到指定的记录位置处。
忽略记录号,则表示在当前记录后的位置插入一条记录。
9.4.3读随机文件
Get [#]文件号,[记录号 ],变量名忽略记录号,则读出当前记录后的那一条记录。
例 9.5 设计一个简单的学生成绩管理程序,使用随机文件存储学生信息。程序的运行界面下图所示,该程序的具有数据添加、修改、删除及学生信息顺序查询等功能。
在标准模块 Module1中定义学生信息数据类型及全局变量:
Type Student ' 定义学生信息记录类型
Id As String * 8
Name As String * 10
Class As String * 10
Subject As String * 20
Mark(1 To 3) As Integer
End Type
' 定义 Student类型的变量存放当前记录内容
Public Stu As Student
Public Filename As String ' 定义变量存放学生信息文件名
Public Rec_no As Integer ' 定义变量存放当前记录号
Public Rec_total As Integer ' 定义变量存放总记录数
Public Rec_long As Integer ' 定义变量存放记录长度
1 打开文件
Open "文件名 " For Binary As #文件号
2,写操作
Put [#]文件号,[位置 ],变量名写入长度等于变量长度的数据。
3,读操作
GET [#]文件号,[位置 ],变量名从指定位置开始读出长度等于变量长度的数据存入变量中,数据读出后移动变量长度位置,如果忽略位置,则表示从文件指针所指的位置开始读出数据,数据读出后移动变量长度位置。
9.5 二进制文件例 9.6 编程序实现将 D盘根目录中的文件 Abc.dat复制到 A
盘,且文件名改为 Myfile.dat。
Dim char As Byte
' 打开源文件
Open "D:\Abc.dat" For Binary As # 1
' 打开目标文件
Open "A:\Myfile.dat" For Binary As # 2
Do While Not EOF(1)
Get #1,,char ' 从源文件读出一个字节
Put #2,,char ' 将一个字节写入目标文件
Loop
Close#1,#2
9.6 常用的文件操作语句和函数
1,改变当前驱动器( ChDrive 语句 )
格式,ChDrive drive
功能:改变当前驱动器。
说明:
如果 drive为“”,则当前驱动器将不会改变;如果
drive中有多个字 符,则 ChDrive只会使用首字母。
例如,ChDrive "D" 及 ChDrive "D:\" 和 ChDrive "Dasd"
都是将当前驱动器设为 D盘。
9.6.1 文件操作语句
2,改变当前目录( ChDir 语句)
格式,ChDir path
功能:改变当前目录。
例如,ChDir "D:\TMP"
说明,ChDir语句改变缺省目录位置,但不会改变缺省驱动器位置。例如,如果缺省的驱动器是 C,则上面的语句将会改变驱动器 D上的缺省目录,但是 C仍然是缺省的驱动器:
2,删除文件( Kill语句)
格式,Kill pathname
功能:删除文件。
说明,pathname中可以使用统配符,*”和,?”。
例如,Kill "*.TXT "
Kill "C:\Mydir\Abc.dat"
4,建立( MkDir 语句)和删除( RmDir 语句)目录建立目录 格式,MkDir path
功能:创建一个新的目录。
例如:
MkDir "D:\Mydir\ABC"
删除目录 格式,RmDir path
功能:删除一个存在的目录。
说明:只能删除空目录。
例如:
RmDir "D:\Mydir\ABC“
说明:
RmDir只能删除空子目录,如果想要使用 RmDir来删除一个含有文件的目录或文件夹,则会发生错误。
5 拷贝文件 ——FileCopy语句格式,FileCopy source,destination
功能:复制一个文件。
例如:
FileCopy "D:\Mydir\Test.doc" "A:\MyTest.doc"
说明,FileCopy语句不能复制一个已打开的文件。
6 文件的更名 —— Name 语句格式,Name oldpathname As newpathname
功能:重新命名一个文件或目录。
例:
Name "D:\Mydir\Test.doc" As "A:\MyTest.doc"
说明,(1) Name具有移动文件的功能。
(2) 不能使用统配符,*”和,?”,不能对一个已打开的文件上使用 Name语句。
7 设置文件属性 ——SetAttr 语句 。
格式:
SetAttr FileName,attributes
其参数含义:
FileName:必要参数 。 一个文件名的字符串表达式 。
Attributes:必要参数 。 常数或数值表达式,其总和用来表示文件的属性 。 Attributes参数设置下表:
内部常数 数值 描 述
VbNormal 0 常规 (缺省值 )
VbReadOnly 1 只读。
VbHidden 2 隐藏。
VbSystem 4 系统文件
VbArchive 32 上次备份以后,文件已经改变
1 获得当前目录 ——CurDir函数格式,CurDir[(drive)]
功能,利用 CurDir函数可以确定指定驱动器的当前目录。
说明,可选的 Drive参数是一个字符串表达式,它指定一个存在的驱动器。如果没有指定驱动器,或 Drive是零长度字符串 (“”),则 CurDir会返回当前驱动器的路径。
例如:
str=CurDir(“C:”)
获得 C盘当前目录路径,并赋值给变量 Str
9.6.2 文件操作函数
2 获得文件属性 ——GetAttr函数 。
格式,GetAttr(FileName)
功能,返回代表一个文件,目录,或文件夹的属性的
Integer数据 。 GetAttr返回的值及代表的含义下表内部常数 数值 描 述
VbNormal 0 常规
vbReadOnly 1 只读
VbHidden 2 隐藏
VbSystem 4 系统文件
VbDirectory 16 目录或文件夹
VbArchive 32 上次备份以后,文件已经改变
Vbalias 64 指定的文件名是别名
3,FileDateTime函数格式,FileDateTime(FileName)
功能,返回一个 Variant (Date),此值为一个文件被创建或最后修改后的日期和时间 。
4,FileLen函数格式,FileLen(FileName)
功能,返回一个 Long,代表一个文件的长度,单位是字节 。
5,Shell函数和 Shell过程在 VB中,可以调用在 DOS下或 Windows下运行的应用程序:
函数调用形式:
ID=Shell( FileName [,WindowType] )
说明,执行一个可执行文件,返回一个 Variant (Double),
如果成功的话,代表这个程序的任务 ID,它是一个唯一的数值,用来指明正在运行的程序 。 若不成功,则会返回 0
过程调用形式:
Shell FileName [,WindowType])
FileName:是要执行的应用程序名字符串,包括盘符,路径,它必须是可执行的文件 。
WindowType:为整型值,表示执行应用程序打开的窗口类型,其取值下表。
内部常量 值 描 述
VbHide 0 窗口被隐藏,且焦点会移到隐式窗口
VbNormalFocus 1 窗口具有焦点,且会还原到它原来的大小和位置
VbMinimizedFocus 2 ( 缺省 ) 窗口会以一个具有焦点的图标来显示 (最小化 )
VbMaximizedFocu
s
3 窗口是一个具有焦点的最大化窗口
VbNormalNoFocus 4 窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动
VbMinimizedNoFocus 6 窗口会以一个图标来显示 。 而当前活动的的窗口仍然保持活动例如:
' 调用执行 Windows系统中的记事本
i = Shell("C:\WINDOWS\NOTEPAD.EXE")
进入 MS_DOS状态
j = Shell("c:\command.com",1)
也可按过程形式调用:
Shell "C:\WINDOWS\NOTEPAD.EXE"
Shell "c:\command.com",1
注意,上面指定的执行文件,可能因不同计算机系统,文件的路径有所不同 。
*9.7 文件系统对象说明,本节为选学内容,教师可根据学生及课时情况,
进行选择讲解可让学习较好的学生自学。
在 VB6.0中新增了文件系统对象 ( File System Object 缩写为 FSO) 模型,它提供了一整套对文件系统进行管理和操作的方法和属性,包括:
获得驱动器的信息,如驱动器列表,盘符,磁盘空间等 。
获得文件夹的或文件的信息,如名称,创建,修改日期等 。
检查指定的文件夹或文件是否存在及在什么位置 。
文件夹或文件的删除,移动,复制等通常操作 。
对文本文件的读写操作 。
9.7.1 FileSystemObject对象
FileSystemObject对象是 FSO模型中的核心对象,在应用程序中使用 FSO的编程主要步骤是:
创建一个 FileSystemObject对象。
根据应用程序的需要,通过调用 FileSystemObject对象中的方法来创建一个新的对象,如 Drive对象,Folder对象等。
通过读取新对象的属性值获得用户所需的信息或利用对象的方法进行所需的操作。
1,创建 FileSystemObject对象有两种方法创建 FileSystemObject对象:
方法一,使用 New 关键字声明一个变量为 FileSystemObject对象类型。其语法格式:
Dim <变量名 > As New FileSystemObject
例如,Dim fsox As New FileSystemObject
方法二,使用 CreateObject方法创建一个 FileSystemObject对象,
其语法格式:
Set <变量名 >=CreateObject("Scripting.FileSystenObject ")
例如,Dim fsox As Object
Set fsox=CreateObject("Scripting.FileSystenObject ")
2,FileSystemObject对象的属性
FileSystemObject的属性只有一个 Drives,它是系统中所有 Drive对象的对象集合,用户可以获取当前计算机系统中所有驱动器的信息。
例如 下面的代码可显示系统能够使用的驱动器名称:
Dim fsox As New FileSystemObject
For Each I In fsox,Drives
Print i.DriveLetter
Next I
2,FileSystemObject对象的方法
FileSystemObject对象有许多方法,在 FSO模型中对文件的管理就是通过这些方法来完成的。
FileSystemObject对象的方法见教材 Pg.249表 9.7
9.7.2 Drive 对象通过 Drive对象可以获得计算机上关于驱动器的信息。
诸如驱动器有多少可用空间,其共享名称是什么,等等。
要使用 Drive对象,首先要声明一个驱动器类型的变量,
接着使用 FileSystemObject对象的 GetDrive方法返回一个
Drive对象,例如:
Dim drv As Drive
Set drv=fsox.GetDrive(“C:”)
Drive对象常用的属性见表 9.7
例 9.7 使用 FileSystemObject对象,编写一个来显示当前计算机系统中一指定驱动器的信息的函数 ShowdriveSize。
9.7.3 Folder 对象要使用 Folder对象,首先要声明一个文件夹类型的变量,
接着使用 FileSystemObject对象的 Get Folder方法返回一个
Folder对象,例如:
Dim fld as Folder
Set fld=fsox.GetFolder(“C:\Mydir”)
Folder对象常用的属性见教材 P251表 9.8
例 9.8 使用 Folder 对象和 FileSystemObject 对象来操作文件夹,并显示相关信息 。
程序运行在立即窗口的输出结果下图
9.7.4 File对象要使用 File对象,首先要声明一个文件类型的变量,接着使用 FileSystemObject对象的 GetFile方法来返回一个 File
对象,例如:
Dim fil As File
Set fil=fsox.GetFile("C:\Lcstxt\t1.txt")
File对象常用的属性见表 9.9
例 9.9 要把,C:\Mydir\t1.txt”文件以同名复制到 A盘新建的,A:\temp”文件夹下,要考虑到软盘插入否和软盘容量够否 。
9.7.5 TestStream对象
FileSystemObject对象模型还提供了 TextStrema对象,
用来读写顺序文件。
1,声明和创建 TextStream对象声明 TextStrem对象例子如下:
Dim ts As TextStream
可分别通过 FileSystemObject 对象,File对象来创建,打开
TextStream对象 。
(1) 通过 FileSystemObject对象打开,C:\Mydir\t1.txt”:
Set ts=fsox.Open TextFile(“C:\t2.txt”,_
ForReading,True)
第 3个参数表示当要打开的文件不存在,是否要创建一个新文件 。
2 通过 File对象打开,C:\Mydir\t1.txt”:
Set fil=fsox.GetFile(“C:\Mydir\t1.txt”)
Set ts=fil.OpenAsTextStream(ForReading)
上述两种方法均以读的方式打开文本文件 。
其中,ForReading表示从文件中读出信息 。 此外,还有
ForWriting 表示向文件写信息; ForAppending向文件添加信息 。
2,常用属性
3,常用方法例 9.10
本章小结:
作业: