580 likes | 694 Views
第五章 文件. 本章内容及要求: 1 掌握文件系统控件(驱动器列表框 drvDrive 、目录列表框 dirDirectory 、文件列表框 filFile 。 2 掌握 VB 中文件的概念、种类及其结构; 3 掌握顺序文件的操作:打开、读 / 写、关闭; 4 了解随机文件的操作:打开、读 / 写、关闭; 5 了解二进制文件的操作。 6 了解使用 FileSystem Object (FSO) 对象模型对文件进行操作的一些基础知识. 本章重点: 1 文件系统控件驱动器列表框、目录列表框、文件列表框的使用。
E N D
第五章 文件 本章内容及要求: 1 掌握文件系统控件(驱动器列表框drvDrive、目录列表框dirDirectory、文件列表框filFile。 2 掌握VB中文件的概念、种类及其结构; 3 掌握顺序文件的操作:打开、读/写、关闭; 4 了解随机文件的操作:打开、读/写、关闭; 5 了解二进制文件的操作。 6 了解使用FileSystem Object (FSO) 对象模型对文件进行操作的一些基础知识
本章重点: 1 文件系统控件驱动器列表框、目录列表框、文件列表框的使用。 2 顺序文件的操作:打开、读/写、关闭; 本章难点: 随机文件、二进制文件的操作,FileSystem Object (FSO) 对象模型。 教学方法:
9.1 文件的概念 一、文件及其结构 文件:存储在外部介质上数据的集合。按名存取 磁盘文件是由数据记录组成。记录是计算机处理数据的基本单位,它由一组具有共同属性相互关联的数据项组成。 数据项
二、文件分类 • 根据访问文件的方式将文件分成3类: • 顺序文件 • 随机文件 • 二进制文件。 1.顺序文件 顺序文件(Sequential File)是普通的文本文件。顺序文件中的记录按顺序一个接一个地排列。读写文件存取记录时,都必须按记录顺序逐个进行。一行一条记录(一项数据),记录可长可短,以“换行”字符为分隔符号。
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事件发生。
9.2.3 文件列表框(FilelistBox) 文件列表框(FileListBox)控件用来显示 Path 属性指定的目录中的文件定位并列举出来。该控件用来显示所选择文件类型的文件列表。 1.常用属性 (1)Path属性 用于返回和设置文件列表框当前目录,设计时不可用。 说明:当Path值的改变时,会引发一个PathChange事件。
(2)Filename属性 用于返回或设置被选定文件的文件名,设计时不可用。 说明:Filename属性不包括路径名。 例如:要从文件列表框(File1)中获得全路径的文件名Fname$,用下面的程序代码: If Right(file1.path,1) ="\" Then Fname$=file1.path & file1.filename Else Fname$=file1.path & "\" & file1.filename End If 此条件也可改为:Len(file1.path)>3
(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
9.2.4 文件系统控件的联动。 说明:要使驱动器、目录和文件列表框同步显示,那么就需要编写代码才能使它们之间彼此同步。 Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Sub Dir1_Change() filFile.Path = Dir1.Path End Sub
关闭文件 打开文件 读出或写入 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
向文件写入内容使用Print # 语句或Write#语句,在程序是数据输出。 9.3.2 顺序文件的读写操作 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中定义学生信息数据类型及全局变量:在标准模块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 ' 定义变量存放记录长度
9.5 二进制文件 1 打开文件 Open "文件名" For Binary As #文件号 2. 写操作 Put [#]文件号,[位置],变量名 写入长度等于变量长度的数据。 3. 读操作 GET [#]文件号,[位置],变量名 从指定位置开始读出长度等于变量长度的数据存入变量中,数据读出后移动变量长度位置,如果忽略位置,则表示从文件指针所指的位置开始读出数据,数据读出后移动变量长度位置。
例9.6编程序实现将D盘根目录中的文件Abc.dat复制到A盘,且文件名改为Myfile.dat。例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 常用的文件操作语句和函数 9.6.1 文件操作语句 1. 改变当前驱动器(ChDrive 语句) 格式:ChDrive drive 功能:改变当前驱动器。 说明: 如果drive为“”,则当前驱动器将不会改变;如果drive中有多个字 符,则ChDrive只会使用首字母。 例如:ChDrive "D" 及ChDrive "D:\" 和ChDrive "Dasd" 都是将当前驱动器设为D盘。
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来删除一个含有文件的目录或文件夹,则会发生错误。
拷贝文件 ——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语句。
内部常数 数值 描 述 VbNormal 0 常规(缺省值) VbReadOnly 1 只读。 VbHidden 2 隐藏。 VbSystem 4 系统文件 VbArchive 32 上次备份以后,文件已经改变 • 设置文件属性——SetAttr 语句。 格式: SetAttr FileName, attributes 其参数含义: FileName:必要参数。一个文件名的字符串表达式。 Attributes:必要参数。常数或数值表达式,其总和用来表示文件的属性。Attributes参数设置下表:
9.6.2 文件操作函数 1 获得当前目录——CurDir函数 格式:CurDir[(drive)] 功能:利用CurDir函数可以确定指定驱动器的当前目录。 说明:可选的Drive参数是一个字符串表达式,它指定一个存在的驱动器。如果没有指定驱动器,或Drive是零长度字符串(“”),则CurDir会返回当前驱动器的路径。 例如: str=CurDir(“C:”) 获得C盘当前目录路径,并赋值给变量Str
内部常数 数值 描 述 VbNormal 0 常规 vbReadOnly 1 只读 VbHidden 2 隐藏 VbSystem 4 系统文件 VbDirectory 16 目录或文件夹 VbArchive 32 上次备份以后,文件已经改变 Vbalias 64 指定的文件名是别名 • 获得文件属性——GetAttr函数。 • 格式:GetAttr(FileName) • 功能:返回代表一个文件、目录、或文件夹的属性的Integer数据。GetAttr返回的值及代表的含义下表
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 (缺省)窗口会以一个具有焦点的图标来显示(最小化) VbMaximizedFocus 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