270 likes | 440 Views
第 7 章 文件. 7.1 文件 7.2 顺序文件 7.3 随机文件 7.4 二进制文件 7.5 常用文件操作语句与函数 7.6 综合应用实例.
E N D
第7章 文件 7.1 文件 7.2 顺序文件 7.3 随机文件 7.4 二进制文件 7.5 常用文件操作语句与函数 7.6 综合应用实例
文件是操作系统管理外部数据的基本单元。大型的数据应由数据库管理系统来管理,这样数据操作更为便利,便于实现数据的共享。但直接操作文件来存取数据可以获得更大的灵活性,运行的效率也会更高。VB对文件的操作可分为两个层次,一是文件系统的操作,如文件复制、删除等;二是文件内部的操作,如读取数据、修改数据等。VB提供了三种机制来操作文件:面向过程的代码方式、面向对象的代码方式、可视化方式。面向过程的代码方式在文件内部操作方面功能较全面,面向对象的代码方式在文件系统操作方面功能较丰富。文件系统控件将在第8章介绍。文件是操作系统管理外部数据的基本单元。大型的数据应由数据库管理系统来管理,这样数据操作更为便利,便于实现数据的共享。但直接操作文件来存取数据可以获得更大的灵活性,运行的效率也会更高。VB对文件的操作可分为两个层次,一是文件系统的操作,如文件复制、删除等;二是文件内部的操作,如读取数据、修改数据等。VB提供了三种机制来操作文件:面向过程的代码方式、面向对象的代码方式、可视化方式。面向过程的代码方式在文件内部操作方面功能较全面,面向对象的代码方式在文件系统操作方面功能较丰富。文件系统控件将在第8章介绍。
7.1 文件 • 所谓文件一般指存储在计算机外部介质上一组相关信息的集合,计算机的操作系统是以文件为单位对数据进行管理的。当我们想要找到存储在计算机外部介质上的信息,必须按文件名找到其对应的文件,然后再从该文件中读取信息;反之,要向外部介质上存储信息,也必须先找到或建立一个文件,然而再向该文件中输入信息。这两个过程分别称为文件的读和写。
7.1.1 文件的结构 • 与文件结构相关的几个概念: • 1.字符 • 它是数据文件中的最小信息单位,如单个的字节、数字、标点符号等等。 • 2.字段 • 一般由几个字符组成的一项独立的数据,称为字段。例如,学生的姓名、年龄、考试分数等都称之为字段。 • 3.记录 • 由若干个字段组成的一个逻辑单位,称为记录。一般记录中的各个字段之间有着相互关系,如每个学生的姓名、年龄、考试分数三个字段组成一个学生信息记录。 • 4.文件 • 文件是一个以上相关记录的集合,如若干个学生记录组成一个文件。文件是将计算机处理的信息永久保存在磁介质上的基本方法。
7.1.2 文件的存取类型 • VB提供了三种文件存取类型:顺序存取、随机存取和二进制存取。 • 1. 顺序存取:顺序存取方式规则最简单,存入一个顺序文件时,依序把文件中的每个字符转换为相应的ASCII码存储;读取数据时必须从文件的头部开始,按文件写入的顺序,依次读出,不能直接读取它中间的一部分数据。用顺序存取方式形成的文件称为顺序文件。 • 顺序存取方式适合以整个文件为单位存取的场合。它主要用于文本文件。 • 2.随机存取:随机存取的文件由一组固定长度的记录组成,每条记录分为若干个字段,每个字段的长度固定,可以有不同的数据类型,一般用自定义数据类型来建立这些记录。用随机存取方式形成的文件称为随机文件。 • 随机文件中每个记录有一个记录号,通过指定记录号,可随机地访问每一笔数据,不像顺序文件那样必须按顺序存取。随机文件适合于以记录为单位存取的场合。 • 3.二进制存取:二进制存取方式可以存储任意希望存储的数据。它与随机文件很类似,但没有数据类型和记录长度的限制。用二进制存取方式形成的文件称为二进制文件。
7.2 顺序文件 • 7.2.1顺序文件的打开与关闭 • 打开顺序文件使用Open语句,格式为: • Open文件名For Input|Output|Append As文件号 [Len=缓冲区长度] • 顺序文件有三种打开方式。 • 按Input方式打开的文件只能读取不能写入,打开时文件必须已经存在,否则会报错误。 • 按Output或Append方式打开的文件只能写入不能读取,如果存在的同名文件,按Output方式打开文件时会先清空该文件, • 按Append方式打开文件时会保留原有内容。选项 Len 参数指定读写缓冲区字符长度。 • 顺序文件在重新打开它之前必须先使用 Close 语句关闭它。 • 关闭文件用Close语句,语法格式为: • Close [ #文件号] [, #文件号] … … • 该语句的功能是关闭指定的文件,释放缓冲区。若不指定文件号,则关闭所有打开的文件。 • 程序运行结束时,VB会自动关闭所有打开的文件,但当对打开的文件做完所需的操作后及时关闭是个好习惯,不仅节约内存,也避免意外情况丢失数据。
7.2.2 顺序文件的写操作 • 写操作只能对按Output 或Append方式打开的文件进行。 • 将数据写入顺序文件可以使用 Print # 语句和Write # 语句。 • 1. Print # 语句 • 格式: Print #文件号,[输出项表] • 输出项表由若干表达式和Spc(n)或Tab[(n)]、空格、分号“;”、逗号“,”组成。 • Spc(n)代表n个空格字符。 • Tab(n) 表示将输出项在当前行的第n列的位置输出。如果当前行上的打印位置大于 n,则 Tab 将打印位置移动到下一个输出行的第 n 列上。如果 n 小于 1,则 Tab 将打印位置移动到列 1。如果 n 大于输出行的宽度,则 Tab 函数使用公式n Mod width计算下一个打印位置。 • 空格、分号“;”、逗号“,”与Print语句中的输出格式相同。
7.2.2 顺序文件的写操作 • 【例7-1】在C盘VBFILE目录下建立TEST.TXT数据文件,并往文件中输入字符。 • Open “C:\VBFILE\TEST.TXT” For Output As #1 ’打开文件 • Print #1,"This is a test" ’向文件中写入字符串 • Print #1, ’输出一个空行 • Print #1, "Zone 1";Tab; "Zone 2" ’在两个打印区输出 • Print #1, "Hello";" ";"World" ’用空格分隔字符串 • Print #1,Spc(5); "5 leading spaces" ’先输出5个空格,再输出字符串 • Print #1,Tab(10); "Hello" ’在第10列上输出字符串 • Close #1 ’关闭文件 • 程序执行后,建立的TEST.TXT文件的格式如图7-1所示。 • 图7-1 例7-1运行后写入文件的内容
7.2.2 顺序文件的写操作 • 【例7-2】以下程序使用Write语句向文件写入数据。 • Private Sub Command1_Click() • 图7-2 例7-2运行后写入文件的内容 • Dim F As Boolean • Open "c:\1.txt" For Output As #1 • F = True • Write #1, Date, "asd", "12321", 123 • Write #1, F • Close • End Sub • 程序执行后,建立的1.TXT文件的格式如图7-2。
7.2.3顺序文件的读操作 • 顺序文件可用Line语句、Input语句或Input函数进行读操作。 • 1.Line Input语句 • 格式: • Line Input #文件号, 变量名 • 变量只能是 Variant 或 String 类型。Line Input # 语句一次从文件中读取一行字符赋给变量。回车-换行符将被丢弃,不会被附加到字符串上。Line Input # 语句一般用来读取Print # 语句写入的数据。可以根据函数Eof的返回值判断文件是否已读完。
7.2.3顺序文件的读操作 • 【例7-3】用Line Input函数逐行读入一个文本文件的全部内容。 • Private Sub Command1_Click() • Dim c As String • Open "c:\boot.ini" For Input As #1 • Do While Not EOF(1) • Line Input #1, c • Text1.Text = Text1.Text + c • Loop • Close #1 • End Sub • 程序运行结果如图7-3所示。
7.2.3顺序文件的读操作 • 2.Input语句 • 格式: Input #文件号, 变量名表 • Input # 语句可以用于以 Input 或 Binary 方式打开的文件。Input # 语句按变量名表的顺序依次读取文件中用逗号或回车-换行符分隔的数据项。读取的规则与Write # 语句写入规则相对应。Write # 语句写入的数据可以用Input # 语句正确的读出。数据中的双引号、“#”将被忽略。如果变量为数值类型而数据不是数值类型,则指定变量的值为零。在读数据项目时,如果已到达文件结尾,则会终止输入,并产生一个错误。 • 3. Input函数 • 还可以使用函数Input(字符数,文件号)来读取任意数量的字符,所给的变量大小应足够大。要将整个文件复制到变量,可以使用函数InputB(字符数,文件号)将字节从文件复制到变量。因为InputB 函数返回一个 ANSI 字符串,可以使用 StrConv 函数将 ANSI 字符串转换为UNICODE 字符串,例如: • LinesFromFile = StrConv(InputB(LOF(FileNum), FileNum), vbUnicode)
7.2.3顺序文件的读操作 • 【例7-4】用Input函数一次读入一个文本文件的全部内容。 • Private Sub Command1_Click() • Open "c:\boot.ini" For Input As #1 • Text1 = Input(LOF(1), 1) • Close • End Sub • 程序运行结果如图7-3所示。可见同一功能可以用不同的方法实现。
7.3 随机文件 • 随机文件是以记录为基本单位进行存取的,每条记录的长度相同,这样可以很方便的定位到某条记录。随机文件特别适合快速存取一组相关的数据。 • 随机文件一般使用自定义类型的变量来读写。用Type语句可以将相互关联的数据项组合成用户自定义类型。 • 1.打开随机文件 • 打开随机文件使用Open语句,格式为: • Open 文件名 [For Random] [Access 读写方式] [共享方式] As 文件号 [Len=记录的字节长度] • For Random是默认值,可以省略。记录的字节长度一般可以使用Len或LenB函数来返回记录类型变量的字节长度。需注意如果记录类型包含可变字符串或变体类型的成员,则Len或LenB函数不能正确的返回记录类型变量实际占用的存储空间。记录的字节长度默认值为128。其他参数与打开二进制文件相同。 • 随机文件使用记录号对记录进行定位,或者说记录号就是随机文件中的文件指针。
7.3 随机文件 • 2.写随机文件 • 写随机文件使用Put语句,格式为: • Put 文件号,记录号,变量名 • 如果变量类型写入的长度值小于记录长度,则写入数据的终点到下一条记录起点之间的原文件内容保持不变。如果变量类型写入的长度值大于记录长度,就会报错。因此,我们一般尽量按定长记录方式进行随机文件的操作。 • 3.读随机文件 • 读随机文件使用Get语句,格式为: • Get 文件号,记录号,变量名 • Get语句变量读取规则和Put语句变量写入规则相对应。读写位置和变量类型相同时,能够正确的还原数据。
person1.Name = "王五" person1.Score = 83 Put #1, 3, person1 person1.Name = "赵六" person1.Score = 72 Put #1, 4, person1 Close #1 MsgBox "数据已写入文件d:\Score.dat中!", vbInformation End Sub Private Sub Command2_Click() Dim person1 As ID Dim i As Integer Print Open "d:\Score.dat" For Random As #1 Len = Len(person1) Print "文件长" & LOF(1) For i = 1 To 4 Get #1, i, person1 Print "第"; i; "条记录: "; "姓名 "; person1.Name; " 成绩 "; person1.Score Next i Close #1 End Sub • 【例7-5】创建一个窗体模块和一个标准模块,窗体参见图7-4。 • 添加一标准模块,代码如下: • Type ID • Score As Integer • Name As String * 6 • End Type • 窗体模块代码如下: • Option Explicit • Private Sub Command1_Click() • Dim person1 As ID • Open "d:\Score.dat" For Random As #1 Len = Len(person1) • person1.Name = "张三" • person1.Score = 87 • Put #1, 1, person1 • person1.Name = "李四" • person1.Score = 97 • Put #1, 2, person1
7.4 二进制文件 • VB提供的二进制文件读写方式可以实现对文件读写的完全控制。 • 1.打开和关闭文件 • (1)打开二进制文件使用Open命令,格式如下: • Open 文件名 For Binary [Access 读写方式] [共享方式]As 文件号 • 文件号是唯一标识已打开文件的长整型数据,如果用同一文件号打开两个文件就会产生错误,可以使用函数FreeFile来获得未被占用的文件号。读写方式指定打开的文件是只读(Read)、只写(Write)还是可读可写(Read Write),默认为可读可写。共享方式指定打开的文件可以被多次打开的方式,可以是可以共享(Shared)、不能共享读(Lock Read)、不能共享写(Lock Write)、和不能共享读写(Lock Read Write),默认为共享。 • 如果指定的文件不存在,则会新建该文件。 • (2)关闭文件使用Close语句,格式如下: • Close [文件号][,…] • 可以同时关闭多个文件。不带参数时关闭所有已打开的文件。
7.4 二进制文件 • 2.文件指针 • 二进制文件可以从任意位置开始读写,每个文件都有一个长整型的文件指针指向下一个将要进行读写的字节位置。刚打开的文件其文件指针为1,随着读写操作的进行,文件指针会跟着往后移,指向最后读写的字节的下一个字节。函数Seek(文件号)可以返回文件指针的当前值。函数Loc(文件号)可以返回最后读写的字节的位置。 • 语句Seek可以设置文件指针,格式为: • Seek 文件号,文件位置 • 3.写文件 • 写数据到二进制文件中使用Put语句,格式为: • Put 文件号,[文件位置],变量名 • 该语句将变量内容写到指定的字节位置,写入的字节数由变量类型决定。文件位置缺省时,由文件指针决定写入位置。
7.4 二进制文件 • 4.读文件 • 读取二进制文件的内容使用Get语句,格式为: • Get 文件号,[文件位置],变量名 • 该语句从指定的字节位置开始读取数据,存入变量中。读取数据的字节数由变量类型决定。文件位置缺省时,由文件指针决定读取位置。 • Get语句变量读取规则和Put语句变量写入规则相对应。读写位置和变量类型相同时,能够正确的还原数据。 • 不定长字符串变量读取的字符数与读取前变量的字符长度相等。 • 读文件还可以使用函数Input(字符数,文件号)来读取指定字符数的文件内容,返回值为字符串。 • 读取二进制文件时如果读取位置超过文件长度时,并不会报错,但读取的内容可能是错误的。读文件的位置是否超过文件长度,可根据函数Eof(文件号)的返回值确定,如返回值为True则文件的读位置超过文件长度,返回值为False则文件的读位置未超过文件长度。但在最后一次读取数据时就有可能出现要读取的字节数大于剩余的字节数的情况。函数Lof(文件号)可以返回文件的字节长度,结合函数Loc或函数Seek可以判断要读取的字节数是否大于剩余的字节数。注意FileLen函数只能返回开文件打开前的长度。
7.4 二进制文件 【例7-6】下面的程序演示了二进制文件的读写方法: • Private Sub Command1_Click() '写文件 • Open "T.txt" For Binary As #1 • Dim i As Integer • Dim c As String • Text1 = "Visual Basic 6.0" & vbCrLf & "2006年" • Put #1, , Text1.Text • Close • End Sub • End Sub Private Sub Command2_Click() '读文件 Dim i As Integer Dim char As String * 1 Dim st1 As String Open "T.txt" For Binary As #1 For i = 1 To LOF(1) Get #1, i, char st1 = st1 + char Next i Close Text2.Text = st1 End Sub
VB中有些语句和函数可以直接对磁盘文件及目录操作 1.ChDrive语句 功能:改变当前驱动器。语法格式为: ChDrive “驱动器字母” 例如,执行语句:ChDrive “D” 将把当前驱动器改为D。提供多字符的字符串时,只有第一个字母有效。 2.ChDir语句 功能:改变当前目录。语法格式为: ChDir “[d:]path” 同Dos的CD命令。 3.MkDir语句 功能:创建新目录。语法格式为: MkDir “[d:]path”。 同Dos的MD命令。 4.RmDir语句 功能:删除一个空目录。语法格式为: RmDir “[d:]path” 同Dos的RD命令。 7.5 常用文件操作语句和函数
7.5 常用文件操作语句和函数 5.Kill语句 功能:删除一个或多个(用通配符)文件。 语法格式为: Kill “[d:][path]Filename” 6.Name语句 功能:文件改名或移动文件(并改名)。 语法格式为: Name “旧文件说明” As “新文件说明” 不指定路径或指定相同路径时改名;指定不同路径时移动文件,若文件名也不同则移动并改名。 7.FileCopy语句 功能:复制一个文件。语法格式为: FileCopy “源文件说明”, “目标文件说明” 8.FileDateTime函数 功能:返回文件创建日期或修改日期。语法格式为:FileDateTime(”文件说明”)。 9.GetAttr函数 功能:返回代表文件属性的数值。语法格式为: GetAttr(”文件说明”) 具体属性值或常量可查阅相关的文档。
10.GetAttr语句 功能:设置文件属性。 语法格式为: GetAttr “文件说明”, 属性值或常量表达式 11.FileLen函数 功能:按字节数返回一个磁盘文件的长度。 语法格式为: FileLen(”文件说明”) 对于打开的文件该函数返回打开以前的长度,要取得已打开文件长度应使用Lof函数。 12.Lof函数 功能:返回一个已打开的文件的长度。 语法格式为: Lof(文件号) 13.Eof函数 功能:返回一个指示是否达到文件尾的逻辑值。 语法格式为: Eof(文件号) 7.5 常用文件操作语句和函数
7.5 常用文件操作语句和函数 14.FreeFile函数 功能:返回供Open语句使用的下一个可用文件号。 语法格式为:FreeFile [(0/1)] 参数指定为0(或缺省)时返回1-255之间的文件号;指定为1返回256-511之间的文件号。 15.Seek函数 功能:返回用Open语句打开文件的当前读写位置。 语法格式为:Seek(文件号) 对随机文件,Seek返回当前记录号;对二进制文件,返回当前字节位置。 16.Seek语句 功能:在用Open语句打开的文件中设置下一个读写位置(即文件指针定位)。语法格式为:Seek [#]文件号, 位置
7.6 综合应用实例 • 【例7-7】包含非文本字符的文件在一般的文本编辑器中不能正常显示文件内容,使用二进制文件编辑器就能对任何文件进行显示和编辑。我们来设计一个小巧的二进制文件浏览器。 • 设计过程:图7-7界面设计CommonDialog控件 • 第一步:参照图7-7,设计界面。其中CommonDialog控件为非标准控件,要从部件中载入:右击【工具箱】打开上下文相关菜单,选择【部件】中的【Microsoft Common Dialog Control】。
Option Explicit Dim f As Long Private Sub Command1_Click() '打开文件 f = FreeFile CommonDialog1.InitDir = "D:\temp" '指定要打开的文件的位置 CommonDialog1.ShowOpen '启动"打开"对话框,由用户选择要打开的文件 Open CommonDialog1.FileName For Binary As f ' FileName属性为用户指定的文件名 HScroll1.Max = LOF(f) display End Sub Private Sub display() '显示文件内容 Dim i As Long Dim b As Byte Dim s As String Seek f, HScroll1.Value '指定读文件的位置 Text1 = Input(LOF(f) - HScroll1.Value, f) '字符方式直接显示 Seek f, HScroll1.Value '返回指定读文件的位置 Get f, , b s = n2str(b) '当前字节16进制码 s = s & " " For i = 1 To LOF(f) Get f, , b s = s & n2str(b) & " " Next i Text2 = s '16进制码显示 End Sub Private Sub Form_Load() Label3.Caption = "起点位置:" & HScroll1.Value End Sub '将字节转换为16进制数形式的字符串 Function n2str(ByVal a As Byte) As String Dim s As String Dim m As Long Dim i As Long For i = 1 To 2 m = a Mod 16 a = a \ 16 If m <= 9 Then s = s & Chr(Asc("0") + m) Else s = s & Chr(Asc("A") + m - 10) End If Next i n2str = StrReverse(s) End Function Private Sub HScroll1_Change() '改变读文件起点位置 Label3.Caption = "起点位置:" & HScroll1.Value display End Sub
本章小结 • 本章介绍了VB文件系统的功能和编程方法,涉及的语句、函数比较复杂,要经过自己反复上机实践,进行认真分析,方能较好的掌握。在使用中大家可以调用MSDN取得一定的帮助。最后的实例是一个小实用工具软件,可以用来对文件结构进行分析,限于篇幅对功能没有作过多的扩充,读者可以在此基础上进一步完善。