Visual Basic 语 言 程 序 设 计第 11章 文 件
VB具有较强的处理文件处理的能力,为用户提供了多种处理方法。它既可以直接读写文件,同时又提供了大量与文件操作有关的语句和函数以及用于文件系统的控件,
用户可以使用这些手段开发出功能强大的应用程序。
Visual Basic 语 言 程 序 设 计
11.1 文件系统控件
VB提供了文件系统的控件有三种:驱动器列表框 (DriveListBox)、目录列表框
(DirListBox)、文件列表框 (FileListBox)。
利用这 3个控件,可以建立 Windows中的文件管理器目录窗口界面,图 11.1就是利用这三种控件设计的一个文件管理界面。本节分别介绍这在种控件的使用方法。
Visual Basic 语 言 程 序 设 计
1.1.1 驱动器列表框
驱动器列表框 (Drive ListBox)是一种下拉列表框,通常显示当前驱动器名称,如果单击列表框右端向下的箭头,则就会下拉出该计算机拥有的所有的驱动器名称,在一般情况下,只显示当前的磁盘驱动器名称。单击某个驱动器名,即可把它变为当前驱动器。如图 11.2所示。
Visual Basic 语 言 程 序 设 计
1.常用属性
驱动器列表框的基本属性:
– Name,Left,Top,Height,Width,Visible,Enabled等。目录列表框和文件列表框也具有这些基本属性。
驱动器列表框的特有属性:
– 驱动器列表框的特有属性只有一个 Drive属性,用来设置或返回所选择的驱动器名。
– 格式,[名称,] Drive[ =驱动器名]
– 说明:
(1)名称:是驱动器列表框的名称。
(2)这里的,驱动器名,是指定的驱动器,如果省略,则 Drive属性是当前驱动器。
(3)Drive属性只能用程序代码设置,不能通过属性窗口设置。
Visual Basic 语 言 程 序 设 计
2.常用事件
驱动器列表框最常用的事件是 Change事件。
每次重新设置 Drive属性,都会引发 Change
事件。
驱动器列表框的默认名称为 Drive1,其
Chang事件过程的开头为 Drive1_Change()。
Visual Basic 语 言 程 序 设 计
11.1.2 目录列表框
目录列表框 (DirListBox)用来显示当前驱动器上的目录结构及当前目录下的所有子目录。供用户选择其中的某个目录作为当前目录。在目录列表框中,如果用鼠标双击某个目录,就会显示该目录下的所有目录。例如 C盘 Program Files子目录结构,只需双击 Program Files目录,结果如图
11.3所示。
在目录列表框中只能显示当前驱动器上的目录。
如果要显示其他驱动器上的目录,必须改变路径,
即重新设置目录列表框的 Path属性。
Visual Basic 语 言 程 序 设 计
1.常用属性
目录列表框的基本属性:
– Name,Left,Top,Height,Width,Visible,Enabled等。
目录列表框的特有属性:
– (1)Path属性
格式,[对象,] Path[ ="路径名 "]
功能:该属性适用于目录列表框和文件列表框,用来设置或返回当前驱动器的路径。
说明:
– (1)对象:窗体、目录列表框或文件列表框,如果省略了对象名,则为当前窗体。
– (2)如果省略了路径,则显示当前路径。
–,路径,的格式:驱动器名,\文件夹名\ …
– 例如:
Print Dir1.Path
将显示当前路径 (Dir1是目录列表框的默认控件名 )。而 Dir1.Path="C:\
VFP"
将重新设置路径,在目录列表框中显示 C盘上 VFP目录下的目录结构。
Path属性只能在程序代码中设置,不能在属性窗口中设置。
Visual Basic 语 言 程 序 设 计
2.常用事件
目录列表框的 Path属性值改变时,将引发
Change事件。文件列表框的 Path属性改变时,将引发 Change事件。
Visual Basic 语 言 程 序 设 计
3.驱动器列表框和目录列表框
必须同步驱动器列表框与目录列表框有着密切关系。在一般情况下,改变驱动器列表框中的驱动器名后,目录列表框中的目录应当随之变为该驱动器上的目录,也就是使驱动器列表框和目录列表框必须产生同步效果。这可以通过一个简单的语句来实现。
【 例 11.1】 设计代码,使驱动器列表框和目录列表框同步。
Visual Basic 语 言 程 序 设 计
11.1.3 文件列表框
文件列表框 (File ListBox)是一种下拉列表框,而文件列表框可以用来显示当前目录下的文件 (可以通过 Path属性改变 )。
1.常用属性
– 与文件列表框有关的属性较多,介绍如下:
(1)Pattern属性
– 格式:[窗体,]文件列表框名,Pattern[ =Value]
– 功能,Pattern属性用来设置在执行时要显示的某一种类型的文件。
– 说明:
(1)如果省略,窗体,,则指的是当前窗体上的文件列表框。
(2)Value:指一个文件名字串,如果省略,则显示当前文件列表框的 Pattern
属性值。
(3)它可以在设计阶段用属性窗口设置,也可以通过程序代码设置。在默认情况下,Pattern的属性值为 *.*,即所有文件。在设计阶段,建立了文件列表框后,查看属性窗口中的 Pattern属性,可以发现其默认值为 *.*。如果把它改变为 *.DOC,则在执行程序时,文件列表框中显示的是 *.DOC文件。
Visual Basic 语 言 程 序 设 计例如
在程序代码中设置 Pattern属性如下:
– Print File1.Pattern
– 将显示文件列表框的 File1的 Pattern属性值。
– 【 例 11.2】 在窗体上添加一个文件列表框,在属性窗口中把它的 Pattern属性设置为 *.exe,则文件列表框中只显示扩展名为,exe的文件,如图 11.5所示。
– 如果执行下面语句:
File1.Pattern="*.frm"
则文件列表框 File1中将只显示扩展名为,,frm”的文件。
当 Pattern属性改变时,将产生 Pattern Change事件。
Visual Basic 语 言 程 序 设 计
(2)FileName属性
格式:[窗体,][文件列表框名,] FileName[ =文件名]
功能,FileName属性用来在文件列表框中设置或返回被选定文件的名称和路径。
说明:
– (1)“文件名,,可以有通配符,因此可用它设置 Drive,Path或 Pattern属性。
– (2)该属性在设计状态不能使用。
– (3)ListCount属性
格式:[窗体,]控件,ListCount
功能,ListCount属性返回控件内所列项目的总数。
说明:
– (1)“控件,可以是组合框、目录列表框、驱动器列表框或文件列表框。
– (2)该属性只能在程序代码中使用,不能在属性窗口中设置。
– (4)ListIndex属性
– 格式:[窗体,]控件,ListIndex[ =索引值]
– 功能:用来设置或返回当前控件上所选择的项目的,索引值,(即下标 )。
Visual Basic 语 言 程 序 设 计说明:
(1)“控件,可以是组合框、列表框、驱动器列表框、目录列表框或文件列表框。
(2)在文件列表框中,第一项的索引值为 0,第二项为 1,依次类推。如果没有选中任何项,则 ListIndex属性的值将被设置为 -1。
(3)该属性只能在程序代码中使用,不能在属性窗口设置。
(5)List属性
– 格式:[窗体,]控件,List(索引 )[ =字符串表达式]
– 功能:在 List属性中存有文件列表框中所有项目的数组,可用来设置或返回各种列表框中的某一项目。
– 说明:
(1)“控件,可以是组合框、列表框、驱动器列表框、目录列表框或文件列表框。
(2)格式中的,索引,是某种列表框中项目的下标 (从 0开始 )。
例如:
– For i=0 To Dir1.ListCount
– Print Dir1.List(i)
– Next i
该例用 List属性来输出目录列表框中的所有项目。循环终值 Dir1.ListCount指的是目录列表框中的项目总数,而 Dir1.List(i)指的是每一个项目。
Visual Basic 语 言 程 序 设 计又如:
– For i=0 To File1.ListCount
– Print File1.List(i)
– Next i
该例用 For循环输出文件列表框 File1中的所有项目。 File1.ListCount表示列表框中所有文件的总数,File1.List(i)指的是每一个文件名。
Visual Basic 语 言 程 序 设 计再如:
– Print File1.ListIndex
– Print File1.List(File1.ListIndex)
第一个语句用来输出文件列表框中某一被选中的项目索引值 (下标 )。第二个语句显示以该索引值为下标的项目。
文件列表框还有能否显示相应的文件属性:
Archive,Normal,Hidden,System和
ReadOnly。
Visual Basic 语 言 程 序 设 计说明:
(6)Archive属性
– 该属性决定是否显示文档文件。
(7)Normal属性
– 该属性决定是否显示正常标准文件。
(8)Hidden属性
– 该属性决定是否显示隐含文件。
(9)System属性
– 该属性决定是否显示系统文件。
(10)ReadOnly属性
– 该属性决定是否显示只读文件。
例如,如果仅仅显示系统文件,则应设置 System属性为
True,其他属性设置为 False。
Visual Basic 语 言 程 序 设 计
11.1.3 文件列表框
2.驱动器、目录及文件列表框的同步在实际应用中,驱动器列表框、目录列表框和文件列表框往往需要同步操作,这可以通过 Path属性的改变引发 Change事件来实现。
例如:
– Private Sub Dir1_Change()
– File1.Path=Dir1.Path
– End Sub
该事件过程使窗体上的目录列表框 Dir1和文件列表框 File1产生同步。因为目录列表框
Path属性的改变将产生 Change事件,所以在 Dir1_Change事件过程中,把 Dir1.Path赋给 File1.Path,就可以产生同步效果。
类似地,增加下面的事件过程,就可以使 3种列表框同步操作。
例如:
– Private Sub Drive1_Change()
– Dir1.Path=Drive1.Drive
– End Sub
该过程使驱动器列表框和目录列表框同步,前面的过程使目录列表框和文件列表框同步,从而使 3种列表框同步。
Visual Basic 语 言 程 序 设 计
3.执行文件
文件列表框接收 DblClick事件。利用这一点,可以执行文件列表框中的某个可执行文件。也就是说,只要双击文件列表框中的某个可执行文件,就能执行该文件。这可以通过 Shell函数来实现。
例如:
– Private Sub File1_DblClick()
– x=Shell(File1.FileName,1)
– End Sub
过程中的 FileName是文件列表框中被选择的可执行文件的名字,双击该文件名就能执行。
例如:下面的事件过程是当在文件列表框中单击某个文件名时,输出该文件名。
– Private Sub File1_Click()
– MsgBox "选中的文件是,"+File1.FileName
– File1.Pattern="*.Frm"
– End Sub
【 例 11.3】 驱动器、目录及文件列表框的同步,并在文件列表框中双击某个可执行文件,就能执行该文件。
Visual Basic 语 言 程 序 设 计
11.2 文件基本操作
文件的基本操作指的是文件的删除、拷贝、移动、改名等。
在 VB中,可以通过相应的语句执行这些基本操作。
– 1.拷贝文件 (FileCopy语句 )
格式,FileCopy 〈 源文件名 〉,〈 目标文件名 〉
功能:可以把源文件拷贝到目标文件,拷贝后两个文件的内容完全一样。
说明:打开的文件不能拷贝。拷贝文件不能含有通配符 (*或?)。
– 例如:
FileCopy "A1.doc","A2.doc"
将把当前目录下的一个文件拷贝到同一目录下的另一个文件。
例如:如果将一个目录下的一个文件拷贝到另一个目录下,则必须包括路径信息。 FileCopy "D:\ VB\ A1.doc","D:\ VB1\
A2.doc"
VB没有提供移动文件的语句。实际上,先用 FileCopy语句拷贝文件,
然后用 Kill语句将源文件名删除。
Visual Basic 语 言 程 序 设 计
2.删除文件 (Kill语句 )
格式,Kill 〈 文件名 〉
功能:用该语句可以删除指定的文件。
说明:,文件名,可以含有路径。
例如:
– Kill "D:\ VB\ *.bak"
– 将删除 D盘 VB目录下的备份文件。
– Kill语句具有一定的,危险性,,因为在执行该语句时没有任何提示信息。为了安全起见,当在应用程序中使用该语句时,一定要在删除文件前给出适当的提示信息。
Visual Basic 语 言 程 序 设 计
3.文件 (目录 )重命名 (Name语句 )
格式,Name 〈 原文件名 〉 As 〈 新文件名 〉
功能:可以对文件或目录重命名,也可用来移动文件。
说明:新文件名不能是已存在的文件名。在原文件名和新文件名中,
不能使用通配符,*” 和,?”。
例如:
– Name "A2.doc" As "B2.doc"
– 在一般性况下,,原文件名,和,新文件名,必须在同一驱动器上。如果,新文件名,指定的路径存在并且与,原文件名,指定的路径不同,
则 Name语句将把文件移动到新的目录下,并更改文件名。如果,新文件名,与,原文件名,指定的路径不同但文件名相同,则 Name语句将把文件移到新的目录下,且保持文件名不变。例如:
Name "D:\ VB1\ A1.FRM" As "D:\ VB2\ A1.FRM"
将把 A1.FRM文件从 VB1目录下移到 VB2目录下,在 VB1目录下的 A1.FRM文件被删除。
Visual Basic 语 言 程 序 设 计再如:
– Name "D:\ VB1\ A1.FRM" As "D:\ VB2\
A2.FRM"
– 将原文件从 VB1目录下移到 VB2目录下并重新命名。
– 用 Name语句可以移动文件,不能移动目录,但可以对目录重命名。
– 例如:
Name "D:\ VB1" As "D:\ VB2"
Visual Basic 语 言 程 序 设 计
4.创建新的目录 (MkDir语句 )
格式,MkDir Path
功能:创建一个新的目录。
例如:在 D盘上建立一个 VB1目录。
– MkDir "D:\ VB1"
Visual Basic 语 言 程 序 设 计
5.改变当前驱动器 (ChDrive语句 )
格式,ChDrive Drive
功能:改变当前驱动器。
说明:如果 Drive为 " ",则当前驱动器将不会改变;如果 Drive中有多个字符,则
ChDrive只会使用首字母。
例如:将 D改为当前驱动器。
– ChDrive "D"
Visual Basic 语 言 程 序 设 计
6.改变当前目录 (ChDir语句 )
格式,ChDir Path
功能:改变当前目录。
说明,ChDir语句只能改变缺省目录位置,
但不会改变缺省驱动器位置。
例如,如果缺省驱动器是 C,则下面的语句将会改变驱动器 D中 VB为缺省目录,但是 C
仍然是缺省的驱动器。
– ChDir "D:\ VB"
Visual Basic 语 言 程 序 设 计
7.删除目录 (RmDir语句 )
格式,RmDir Path
功能:删除一个已存在的目录。
说明,RmDir语句不能删除一个含有文件的目录。如果要删除,则应先使用 Kill语句删除所有的文件。
例如:删除 D驱动器上的 VB1目录。
– Kill "D:\ VB1\ *.*"
– RmDir "D:\ VB1"
Visual Basic 语 言 程 序 设 计
8.确定当前目录驱动器 (CurDir
函数 )
格式,CurDir [ (drive)]
功能:确定任何一个驱动器的当前目录。
说明,drive表示要确定当前目录驱动器。
drive为 "",则 CurDir返回当前驱动器的当前目录路径。
Visual Basic 语 言 程 序 设 计
11.3 文 件 概 述
在计算机技术中,常用,文件,这一术语来表示输入输出操作的对象。所谓,文件,,是指存放在外部介质上的数据的集合。每一个文件有一个文件名作为标识。例如用 Word或 Excel编辑制作的文档或表格就是一个文件,把它存放到磁盘上就是一个磁盘文件,输出到打印机上就是一个打印机文件。广义地说,任何输入输出设备都是文件。
计算机以这些设备为对象进行输入输出,对这些设备统一按,文件,进行处理。
在程序设计中,文件是十分有用而且是不可缺少的。
Visual Basic 语 言 程 序 设 计
11.3 文 件 概 述
(1)文件是使一个程序可以对不同的输入数据进行加工处理、产生相应的输出结果的常用手段。
(2)使用文件可以方便用户,提高上机效率。
(3)使用文件可以不受内存大小的限制。
因此,文件是十分重要的。在某些情况下,不使用文件将很难解决所遇到的实际问题。
Visual Basic 语 言 程 序 设 计
11.3.1 文件结构
为了有效地存取数据,数据必须以某种特定的方式存放,这种特定的方式称为文件结构。 VB文件是由记录组成的,记录是由字段组成的,字段是由字符组成的。
Visual Basic 语 言 程 序 设 计
11.3 文 件 概 述
(1)字符 (Character):是构成文件的最基本单位。字符可以是数字、字母、特殊符号或单一字节。这里所说的,字符,一般为西文字符,一个西文字符用一个字节存放。如果为汉字字符,包括汉字和,全角,字符,则通常用两个字节存放。也就是说,一个汉字字符相当于两个西文字符。
一般把用一个字节存放的西文字符称为,半角,字符,而把汉字和用两个字节存放的字符称为,全角,字符。注意,
VB 6.0支持双字节字符,当计算字符串长度时,一个西文字符和一个汉字都作为一个字符计算,但它们所占的内存空间是不一样的。例如,字符串,VB程序设计,的长度为
6,而所占的字节数为 10。
Visual Basic 语 言 程 序 设 计
11.3 文 件 概 述
(2)字段 (Field):也称域。字段由若干个字符组成,用来表示一项数据。例如邮政编码,100084”就是一个字段,
它由 6个字符组成。而姓名,刘大平,也是一个字段,它由 3个汉字组成。
(3)记录 (Record):由一组相关的字段组成。例如在通信录中,每个人的姓名、单位、地址、电话号码、邮政编码等构成一个记录,如表 11.1所示。在 VB中,以记录为单位处理数据。
(4)文件 (File):文件由记录构成,一个文件含有一个以上的记录。例如在通信录文件中有 100个人的信息,每个人的信息是一个记录,100个记录构成一个文件。
Visual Basic 语 言 程 序 设 计
11.3.2 文件分类
根据不同的分类标准,文件可分为不同的类型。
– 1.按数据性质分类
按数据性质,文件可分为程序文件和数据文件。
(1)程序文件 (Program File):这种文件存放的是可以由计算机执行的程序,包括源文件和可执行文件。在 VB中,扩展名为,exe,.frm,.vbp,.vbg,.bas,.cls等的文件都是程序文件。
(2)数据文件 (Data File):数据文件用来存放普通的数据。例如学生考试成绩、职工工资、商品库存等。这类数据必须通过程序来存取和管理。
Visual Basic 语 言 程 序 设 计
2.按数据的存取方式和结构分类
按数据的存取方式和结构,文件可分为顺序文件和随机文件。
– (1)顺序文件 (Sequential File):顺序文件的结构比较简单,文件中的记录一个接一个地存放。在这种文件中,只知道第一个记录的存放位置,其他记录的位置无从知道。当要查找某个数据时,只能从文件头开始,一个记录一个记录地顺序读取,直至找到要查找的记录为止。
优点:顺序文件的组织比较简单,只要把数据记录一个接一个地写到文件中即可,占用空间少,容易使用。
缺点:维护困难,为了修改文件中的某个记录,必须把整个文件读入内存,修改完后再重新写入磁盘。顺序文件不能灵活地存取和增减数据,因而适用于有一定规律且不经常修改的数据。
– (2)随机存取文件 (Random Access File):又称直接存取文件,简称随机文件或直接文件。在随机文件中,每个记录的长度是固定的,记录中的每个字段的长度也是固定的。此外,随机文件的每个记录都有一个记录号。在写入数据时,只要指定记录号,就可以把数据直接存入指定位置。而在读取数据时,只要给出记录号,
就能直接读取该记录。在随机文件中,可以同时进行读、写操作,因而能快速地查找到每个记录,不必为修改某个记录而对整个文件进行读、写操作。
优点:数据的存取较为灵活、方便,速度较快,容易修改。
缺点:占空间较大,数据组织较复杂。
Visual Basic 语 言 程 序 设 计
3.按数据的编码方式分类
按数据的编码方式,文件可以分为 ASCII文件和二进制文件。
– (1)ASCII文件:又称文本文件,它是以 ASCII方式保存的文件。这种文件可以用字处理软件建立和修改 (必须按纯文本文件保存 )。
– (2)二进制文件 (Binary File):它是用二进制方式保存的文件。二进制文件不能用普通的字处理软件编辑,占空间较小。
Visual Basic 语 言 程 序 设 计
11.3.3 文件的打开与关闭
在 VB中,数据文件的操作必须按下述步骤进行:
– (1)打开 (或建立 )文件。一个文件必须先打开或建立后才能使用。如果一个文件已经存在,则打开该文件;如果不存在,则建立该文件。
– (2)进行读、写操作。在打开 (或建立 )的文件上执行所要求的输入输出操作。在文件处理中,把内存中的数据传输到相关联的外部设备 (例如磁盘 )
并作为文件存放的操作叫做写数据,而把数据文件中数据传输到内存程序中的操作叫做读数据。一般来说,在主存与外设的数据传输中,由主存到外设叫做输出或写,而由外设到主存叫做输入或读。
输出或写,主存 ——→ 外设
输入或读,主存 ← ——外设
– (3)关闭文件。文件读写完后,一定要关闭。
文件处理一般需要以上 3步。在 VB中,数据文件的操作是通过有关的语句和函数来实现的。 1.文件的打开 (建立 )
格式,Open 文件名 For方式[ Random存取类型] As[ #]文件号[ Len=记录长度]
功能:为文件的输入输出分配缓冲区,并确定缓冲区所使用的存取方式。或者建立一个文件。
Visual Basic 语 言 程 序 设 计说明:
(1)方式:指定文件的输入输出方式,可以是下述方式之一:
– Output:指定顺序输出方式。
– Input:指定顺序输入方式。
– Append:指定顺序输出方式。与 Output不同的是,当用 Append方式打开文件时,文件指针被定位在文件末尾。如果对文件执行写操作,则写入的数据附加到原来文件的后面。
– Random:指定随机存取方式,也是默认方式。
– Binary:指定二进制方式文件。在这种方式下,可以用 Get和 Put
语句对文件中任何字节位置的信息进行读写。打开文件的类型与
Random方式相同。
–,方式,,是可选的,如果省略,则为随机存取方式,即 Random。
Visual Basic 语 言 程 序 设 计说明:
(2)存取类型:用来指定访问文件的类型。可以是下列类型之一:
– Read:打开只读文件。
– Write:打开只写文件。
– Read Write:打开读写文件。这种类型只对随机文件、
二进制文件及用 Append方式打开的文件有效。
–,存取类型,指出了在打开的文件中所进行的操作。
如果要打开的文件已由其他过程打开,则不允许指定存取类型,否则 Open失败,并产生出错信息。
Visual Basic 语 言 程 序 设 计说明:
(3)文件号:是一个整型表达式,其值为
1~ 511范围内。执行 Open语句时,打开文件的文件号与一个具体的文件相关联,其他输入输出语句或函数通过文件号与文件发生关系。
Visual Basic 语 言 程 序 设 计说明:
(4)记录长度:是一个整型表达式。当选择该参量时,为随机存取文件设置记录长度。对于用随机访问方式打开的文件,该值是记录长度;对于顺序文件,
该值是缓冲字符数。,记录长度,的值不能超过 32 767字节。对于二进制文件,将忽略 Len子句。
– 在顺序文件中,,记录长度,不需要与各个记录的大小相对应,因为顺序文件各个记录的长度可以不相同。当打开顺序文件时,在把记录写入磁盘或从磁盘读出记录之前,,记录长度,指出要装入缓冲区的字符数,即确定缓冲区的大小。缓冲区越大,占用空间越多,文件的输入输出操作越快。反之,缓冲区越小,剩余的内存空间越大,文件的输入输出操作越慢。默认时缓冲区的容量为 512字节。
– 另外,为了满足不同的存取方式的需要,对同一个文件可以用几个不同的文件号打开,每个文件号有自己的一个缓冲区。对于不同的访问方式,可以使用不同的缓冲区。但是,当使用 Output或 Append方式时,必须先将文件关闭,才能重新打开文件。而当使用 Input,Random或 Binary方式时,不必关闭文件就可以用不同的文件号打开文件。
– 例如:下面打开的文件都是按顺序方式输入输出的。
Open "P1.dat" For Output As #1
– 建立并打开一个新的数据文件,使记录可以写到该文件中。
Open "P1.dat" For Output As #1
– 如果文件,P1.dat”已存在,该语句打开已存在的数据文件,新写入的数据将覆盖原来的数据。
Open "P1.dat" For Append As #1
Visual Basic 语 言 程 序 设 计
(4)记录长度:
打开已存在的数据文件,新写入的记录附加到文件的后面,原来的数据仍在文件中。如果给定的文件名不存在,则 Append方式可以建立一个新文件。
– Open "P1.dat" For Input As #1
打开已存在的数据文件,以便从文件中读出记录。
例如:下面是按随机方式打开或建立文件。
– Open "P1.dat" For Radnom As #1
按随机方式打开或建立文件,然后读出或写入定长记录。
– Open "d:\ vb\ P2.dat" For Random As #1 Len=256
用随机方式打开 d盘上的 vb目录下的 P2.dat文件,记录长度为 256字节。
– Filename$="d:\ vb\ P2.dat"
– Open Filename$ For Append As #3
该例先把文件名赋给一个变量,然后打开该文件。
Visual Basic 语 言 程 序 设 计
2.文件的关闭
文件的读写操作结束后,应将文件关闭,
这可以通过 Close语句来实现。
– 格式,Close[[ #]文件号][,[ #]文件号] ……
– 功能:用来结束文件的输入输出操作。
– 例如:假定用下面的语句打开文件:
Open "P1.dat" For Output As #1
– 则可以用下面的语句关闭该文件:
Close#1
Visual Basic 语 言 程 序 设 计说明:
(1)Close语句用来关闭文件,它是在打开文件之后进行的操作。格式中的,文件号,是 Open语句中使用的文件号。关闭一个数据文件具有两方面的作用,第一,把文件缓冲区中的所有数据写到文件中;第二,
释放与该文件相联系的文件号,以供其他 Open语句使用。
(2)Close语句中的,文件号,是可选的。如果指定了文件号,则把指定的文件关闭;如果不指定文件号,则把所有打开的文件全部关闭。
(3)除了用 Close语句关闭文件外,在程序结束时将自动关闭所有打开的数据文件。
(4)Colse语句使 VB结束对文件的使用,它的操作十分简单,但绝不是可有可无的。这是因为,磁盘文件同内存之间的信息交换是通过缓冲区进行的。如果关闭的是为顺序输出而打开的文件,则缓冲区中最后的内容将被写入文件中。当打开的文件或设备正在输出时,执行
Close语句后,不会使输出信息的操作中断。如果不使用 Close语句关闭文件,则可能使某些需要写入的数据不能从内存 (缓冲区 )送入文件中。
Visual Basic 语 言 程 序 设 计
11.3.4 文件操作语句和函数
文件的主要操作是读和写,在此介绍的是通用的语句和函数,这些语句和函数用于文件的读、写操作中。
– 1.文件指针定位语句 Seek
文件被打开后,自动生成一个文件指针 (隐含的 ),文件的读或写就从这个指针所指的位置开始。用 Append方式打开一个文件后,文件指针指向文件的末尾,而如果用其他几种方式打开文件,则文件指针都指向文件的开头。完成一次读写操作后,文件指针自动移到下一个读写操作的起始位置,移动量的大小由 Open语句和读写语句中的参数共同决定。对于随机文件来说,其文件指针的最小移动单位是一个记录的长度;而顺序文件中文件指针移动的长度与它所读写的字符串的长度相同。在 VB中,与文件指针有关的语句和函数是 Seek。
文件指针的定位通过 Seek语句来实现。
– 格式,Seek# 文件号,位置功能:该语句用来设置文件中下一个读或写的位置。
Visual Basic 语 言 程 序 设 计说明:
(1)“文件号,的含义同前;
(2)“位置,是一个数值表达式,用来指定下一个要读写的位置,其值在 1~ (2 31 -1)范围内。
(3)对于用 Input,Output或 Append方式打开的文件,
,位置,是从文件开头到,位置,为止的字节数,即执行下一个操作的地址,文件第一个字节的位置是 1。对于用
Random方式打开的文件,,位置,是一个记录号。
(4)在 Get或 Put语句中的记录号优先于由 Seek语句确定的位置。此外,当,位置,为 0或负数时,将产生出错信息,错误的记录号,。当 Seek语句中的,位置,在文件尾之后时,对文件的写操作将扩展该文件。
Visual Basic 语 言 程 序 设 计
2.Seek函数
与 Seek语句配合使用的是 Seek函数。
格式,Seek(文件号 )
功能:该函数返回文件指针的当前位置。
说明:
– (1)由 Seek函数返回的值在 1~ (2 31 -1)范围内。
– (2)对于用 Input,Output或 Append方式打开的文件,Seek函数返回文件中的字节位置 (产生下一个操作的位置 )。
– (3)对于用 Random方式打开的文件,Seek函数返回下一个要读或写的记录号。
– (4)对于顺序文件,Seek语句把文件指针移到指定的字节位置上,
Seek函数返回有关下次将要读写的位置信息。
– (5)对于随机文件,Seek语句只能把文件指针移到一个记录的开头,
而 Seek函数返回的是下一个记录号。
Visual Basic 语 言 程 序 设 计
3.FreeFile函数
格式:变量 =FreeFile
功能:用 FreeFile函数可以得到一个在程序中没有使用的文件号。
说明:当程序中打开的文件较多时,这个函数很有用。特别是当在通用过程中使用文件时,用这个函数可以避免使用其他 Sub 或 Function过程中正在使用的文件号。利用这个函数,可以把未使用的文件号赋给一个变量,用这个变量作文件号,
不必知道具体的文件号是多少。
【 例 11.4】 用 FreeFile函数获取一个文件号。
Visual Basic 语 言 程 序 设 计
4.Loc函数
格式,Loc(文件号 )
功能,Loc函数返回由,文件号,指定的文件的当前读写位置。
说明:
– (1)格式中的,文件号,是在 Open语句中使用的文件号。
– (2)对于随机文件,Loc函数返回一个记录号,它是对随机文件读或写的最后一个记录的记录号,即当前读写位置的上一个记录;
– (3)对于顺序文件,Loc函数返回的是从该文件被打开用来读或写的记录个数,一个记录是一个数据块。
– 顺序文件和随机文件中,Loc函数返回的都是数值,但它们的意义是不一样的。对于随机文件,只有知道了记录号,才能确定文件中的读写位置;而对于顺序文件,只要知道已经读或写的记录个数,就能确定该文件当前的读写位置。
Visual Basic 语 言 程 序 设 计
5.LOF函数
格式,LOF(文件号 )
功能,LOF函数返回给文件分配的字节数 (即文件的长度 )。
说明:
– (1)与 DOS下用 Dir命令所显示的数值相同。
– (2)“文件号,的含义同前。
在 VB中,文件的基本单位是记录,每个记录的默认长度是 128个字节。因此,对于由 VB建立的数据文件,LOF函数返回的将是 128的倍数,不一定是实际的字节数。例如,假定某个文件的实际长度是 257(128× 2+1)个字节,则用 LOF函数返回的是 384(128× 3)个字节。
对于用其他编辑软件或字处理软件建立的文件,LOF函数返回的将是实际分配的字节数,
即文件的实际长度。
例如,LOF(1)返回 #1文件的长度,如果返回 0值,则表示该文件是一个空文件。
例如:用下面的程序段可以确定一个随机文件中记录的个数:
– RecordLength=60
– Open "d:\ vb1\ P5" For Random As #1
– x=LOF(1)
– NumberOfRecords=x\ RecordLength
Visual Basic 语 言 程 序 设 计
6.EOF函数
格式,EOF(文件号 )
功能,EOF函数用来测试文件的结束状态。
说明:
– (1)在文件输入期间,可以用 EOF测试是否到达文件末尾。
– (2)对于顺序文件来说,如果已到文件末尾,则 EOF函数返回 True,
否则返回 False。
– (3)对于随机文件来说,如果最后执行的 Get语句未能读到一个完整的记录,则返回 True,这通常发生在试图读文件结尾以后的部分时。
– (4)EOF函数常用来在循环中,测试是否已到文件尾,一般结构如下:
Do While Not EOF(1) '文件读写语句
Loop
Visual Basic 语 言 程 序 设 计
11.4 顺 序 文 件
在顺序文件中,记录的逻辑顺序与存储顺序相一致,对文件的读写操作只能一个记录一个记录地顺序进行。
顺序文件的读写操作与标准输入输出十分类似。其中读操作是把文件中的数据读到内存,标准输入是从键盘上输入数据,而键盘设备也可以看做是一个文件。写操作是把内存中的数据输出到屏幕上,而屏幕设备也可以看做是一个文件。
Visual Basic 语 言 程 序 设 计
11.4.1 顺序文件的写操作
数据文件的写操作分为 3步,即打开文件、写入文件和关闭文件。其中打开文件和关闭文件分别由 Open和 Close语句来实现,写入文件由
Print#或 Write#语句来完成。
1.Print#语句
– 格式,Print#文件号,[[ Spc(n)|Tab(n)][表达式表][; |,]]
– 功能:把数据写入文件中。
– 说明:
(1)Print#语句与 Print方法的功能是类似的。 Print方法所,写,的对象是窗体、打印机或控件,而 Print#语句所,写,的对象是文件。
(2)“文件号,的含义同前,数据被写入该文件号所代表的文件中。其他参量,
包括 Spc函数,Tab函数,,表达式表,及尾部的分号、逗号等,其含义与
Print方法中相同。
– 例如:把变量 A,B,C的值写到文件号为 1的文件中。
Print #1,A,B,C
– 例如:把变量 A,B,C的值,写,到窗体上。
Print A,B,C
Visual Basic 语 言 程 序 设 计说明:
(3)格式中的,表达式表,可以省略。在这种情况下,将向文件中写入一个空行。
– 例如,Print #1
(4)和 Print方法一样,Print# 语句中的各数据项之间可以用分号隔开,也可以用逗号隔开,分别对应紧凑格式和标准格式。数值数据由于前有符号位,后有空格,因此使用分号不会给以后读取文件造成麻烦。但是,对于字符串数据,特别是变长字符串数据来说,用分号分隔就有可能引起麻烦,因为输出的字符串数据之间没有空格。
– 例如:
A$="Beijing":B$="Shanghai":C$="Tianjin"
Print #1,A$;B$;C$
– 写到磁盘上的信息为 &&&&(((((“BeijingShanghaiTianjin”。为了使输出的各字符串明显地分开,可以人为地插入逗号,即改为:
Print#1,A$;",";B$;",";C$
Visual Basic 语 言 程 序 设 计说明:
– 这样写入文件中的信息为
,Beijing,Shanghai,Tianjin”。
– 但是,如果字符串本身含有逗号、分号和有意义的前后空格及回车或换行,则须用双引号 (ASCII码 34)作为分隔符,把字符串放在双引号中写入磁盘。
– 例如:
a$="abc,def"
b$="1234.5678"
Print#1,Chr$(34);a$;Chr$(34);Chr$(34);b$;Chr$(34)
– 写入文件的数据为:
"abc,def""1234.5678"
Visual Basic 语 言 程 序 设 计说明:
(5)实际上,Print#语句的任务只是将数据送到缓冲区,数据由缓冲区写到磁盘文件的操作是由文件系统来完成的。对于用户来说,可以理解为由
Print#语句直接将数据写入磁盘文件。但是,执行 Print#语句后,并不是立即把缓冲区中的内容写入磁盘,只有在满足下列条件之一时才写盘:
– ·关闭文件 (Close);
– ·缓冲区已满;
– ·缓冲区未满,但执行下一个 Print#语句。
– 【 例 11.5】 编写程序,用 Print#语句向文件中写入数据。
Visual Basic 语 言 程 序 设 计
2.Write#语句
格式,Write #文件号,表达式表
功能:可以把数据写入顺序文件中。
例如:把变量 A,B,C的值写入文件号为 1的文件中。
– Write#1,A,B,C
– 说明:
(1)当使用 Write#语句时,文件必须以 Output或 Append方式打开。,表达式表,中的各项以逗号分开。
(2)Write#语句与 Print#语句的功能基本相同。二者区别有以下两点:
Visual Basic 语 言 程 序 设 计二者区别有以下两点:
① 当用 Write#语句向文件写数据时,数据在磁盘上以紧凑格式存放,能自动地在数据项之间插入逗号,并给字符串加上双引号。一旦最后一项被写入,就插入新的一行。
②用 Write#语句写入的正数的前面没有空格。
【 例 11.6】 在磁盘上建立一个电话号码文件,存放单位名称和该单位的电话号码。
【 例 11.7】 从键盘上输入 4个学生的数据,然后把它们存放到磁盘文件中。
Visual Basic 语 言 程 序 设 计
11.4.2 顺序文件的读操作
顺序文件的读操作分 3步进行,即打开文件、读数据文件和关闭文件。其中打开文件和关闭文件的操作如前所述,读数据的操作由 Input#语句和
Line Input#语句来实现。
– 1.Input# 语句
格式,Input#文件号,变量表
功能:该语句从一个顺序文件中读出数据项,并把这些数据项赋给程序变量。
例如:
– Input #1,A,B,C
– 从文件中读出 3个数据项,分别把它们赋给 A,B,C三个变量。
Visual Basic 语 言 程 序 设 计说明:
(1)“变量表,由一个或多个变量组成,这些变量既可以是数值变量,
也可以是字符串变量或数组元素,从数据文件中读出的数据赋给这些变量。文件中数据项的类型应与 Input#语句中变量的类型匹配。
(2)在用 Input#语句把读出的数据赋给数值变量时,将忽略前导空格、
回车或换行符,把遇到的第一个非空格、非回车和换行符作为数值的开始,如果遇到空格、回车或换行符,则认为数值结束。对于字符串数据,同样忽略开头的空格、回车或换行符。如果需要把开头带有空格的字符串赋给变量,则必须把字符串放在双引号中。
(3)Input#与 InputBox函数类似,但 InputBox要求从键盘上输入数据,
而 Input#语句要求从文件中输入数据,而且执行 Input#语句时不显示对话框。
(4)Input#语句也可用于随机文件。
Visual Basic 语 言 程 序 设 计
2.Line Input#语句
格式,Line Input#文件号,字符串变量
功能:该语句从顺序文件中读取一个完整的行,并把它赋给一个字符串变量。
说明:
– (1)“字符串变量,是一个字符串简单变量名,也可以是一个字符串数组元素名,用来接收从顺序文件中读出的字符行。
– (2)它可以读取顺序文件中一行的全部字符,直至遇到回车符为止。
此外,对于以 ASCII码存放在磁盘上的各种语言源程序,都可以用
Line Input#语句一行一行地读取。
– (3)Line Input#与 Input#语句功能类似 。只是 Input#语句读取的是文件中的数据项,而 Line Input#语句读的是文件中的一行。
– (4)Line Input#语句也可用于随机文件。
– (5)Line Input#语句常用来复制文本文件。
Visual Basic 语 言 程 序 设 计
3.Input$函数
格式,Input$(n,#文件号 )
功能:该函数返回从指定文件中读出的 n个字符的字符串。也就是说,它可以从数据文件中读取指定数目的字符。
例如:
– X$=Input$(100,#1)
– 从文件号为 1的文件中读取 100个字符,并把它赋给变量 X$。
Visual Basic 语 言 程 序 设 计说明:
Input$函数执行所谓,二进制输入,。它把一个文件作为非格式的字符流来读取。例如,它不把回车-换行序列看做是一次输入操作的结束标志。因此,当需要用程序从文件中读取单个字符时,或者是用程序读取一个二进制的或非 ASCII码文件时,使用 Input$函数较为方便。
【 例 11.8】 把前面建立的学生数据文件 (F3.dat)读到内存,
并在屏幕 (窗体 )上显示出来。
【 例 11.9】 编写程序,对数值数据排序。
【 例 11.11】 编写程序,在文件中查找指定的字符串。
【 例 11.12】 用顺序文件编写一个简单的编辑器。
Visual Basic 语 言 程 序 设 计
11.5.1 随机文件的打开与关闭
随机文件与顺序文件的读写操作类似,但通常把需要读写的记录中的各字段放在一个记录类型中,同时应指定每个记录的长度。
随机文件的读写操作分为以下 4步:
– (1)定义数据类型。随机文件由固定长度的记录组成,每个记录含有若干个字段。记录中的各个字段可以放在一个记录类型中,记录类型用 Type… End Type语句定义。 Type… End Type 语句通常在标准模块中使用,如果放在窗体模块中,则应加上关键字 Private。
– (2)打开随机文件。
– (3)将磁盘的数据读到记录变量中。
– (4)将内存中的数据写入磁盘。
– (5)关闭文件
Visual Basic 语 言 程 序 设 计
1.随机文件的打开操作
打开一个随机文件后,既可用于写操作,也可用于读操作。
格式,Open "文件名 " For Random As#文件号
[ Len=记录长度]
功能:打开一个随机文件。
说明:
– (1)文件以随机访问模式打开后,可以同时进行写入和读出操作。
– (2)“记录长度,等于各字段长度之和,以字符 (字节 )为单位。要指明,记录长度,,否则记录的默认长度为
128个字节。
Visual Basic 语 言 程 序 设 计
2.随机文件的关闭操作
格式,Close [[ #]文件号][,[ #]
文件号] ……
功能:关闭随机文件。
Visual Basic 语 言 程 序 设 计
11.5.2 随机文件的写操作
随机文件的写操作通过 Put语句来实现。
格式,Put [ #]文件号,[记录号],变量
功能:将一个记录变量的内容写入所打开的磁盘文件中指定的记录位置处。
说明:
– (1)这里的,变量,是除对象变量和数组变量外的任何变量 (包括含有单个数组元素的下标变量 )。
– (2)记录号是大于 1的整数,表示写入的是第几条记录。
如果忽略记录号,则表示在当前记录后插入一条记录。
Visual Basic 语 言 程 序 设 计
11.5.3 随机文件的读操作
从随机文件中读取数据的操作与写文件操作步骤类似,只是把第三步中的 Put语句用 Get语句来代替。
格式,Get [ #]文件号,[记录号],变量
功能:从磁盘文件中,将一条记录号指定的记录内容读到记录变量中。
说明:
– (1)“记录号,的取值范围同前,它是要读的记录的编号。
– (2)记录号是大于 1的整数,表示对第几条记录进行操作。如果忽略记录号,则表示读出当前记录后的那一条记录。
– (3)如果省略,记录号,,则逗号不能省略。
– 例如:
Get#1,FileBuff