930 likes | 1.14k Views
第13章 文件管理. 13.1 文件系统控件 13.2 用传统语句和函数访问文件 13.3 文件系统对象. 结束. 13.1 文件系统控件. 13.1.1 驱动器列表框 13.1.2 目录列表框 13.1.3 文件列表框 13.1.4 文件系统控件的同步操作. 返回首页. 13.1.1 驱动器列表框 (1). 驱动器列表框( DriveListBox) 控件的作用是为用户提供一个选择有效磁盘驱动器的功能。该控件可以显示出用户系统中所有有效磁盘驱动器的列表。在图13.1的示意图中,左边是驱动器列表框的原始状态,右边是展开后的状态。.
E N D
第13章 文件管理 • 13.1 文件系统控件 • 13.2 用传统语句和函数访问文件 • 13.3 文件系统对象 结束
13.1 文件系统控件 • 13.1.1 驱动器列表框 • 13.1.2 目录列表框 • 13.1.3 文件列表框 • 13.1.4 文件系统控件的同步操作 返回首页
13.1.1 驱动器列表框 (1) 驱动器列表框(DriveListBox)控件的作用是为用户提供一个选择有效磁盘驱动器的功能。该控件可以显示出用户系统中所有有效磁盘驱动器的列表。在图13.1的示意图中,左边是驱动器列表框的原始状态,右边是展开后的状态。 DriveListBox控件最重要的属性是Drive属性。程序运行时,可以通过该属性获得当前所选择的驱动器,也可以改变Drive属性的值,指定某个驱动器。 图13.1 驱动器列表框示意图
13.1.1 驱动器列表框 (2) 例如: 将驱动器列表框Drive1中所选择的驱动器显示在文本框Text1中: Text1.Text = Drive1.Drive 将驱动器列表框Drive1中的驱动器设置为“e:\”: Drive1.Drive = "e:\" 访问驱动器列表框中的列表项目时,其方式与普通列表框控件类似,即可以使用List属性数组访问;ListCount表示列表项目的个数;ListIndex表示当前选中的项目在列表中的索引位置。
13.1.1 驱动器列表框 (3) 驱动器列表框的主要事件是Change事件。在程序的运行阶段,如果选择了一个驱动器列表项目,或者通过代码改变了Drive属性的值,均将引发控件的Change事件。 【例13.1】将系统的驱动器信息收集到一个列表框中,若在驱动器列表框中选择了一个驱动器,则列表框中的相应驱动器也要被选中。 在窗体上添加一个驱动器列表框Drive1。添加一个普通列表框List1,设其Style属性为1(带有复选框)。设窗体的Caption为“驱动器列表框示例”。
13.1.1 驱动器列表框 (4) 程序的运行结果见图13.2。 代码如下: Private Sub Form_Load() Dim i As Integer For i = 0 To Drive1.ListCount - 1 List1.AddItem Drive1.List(i) Next i End Sub Private Sub Drive1_Change() List1.Selected(Drive1.ListIndex) = True End Sub 返回本节 返回首页
13.1.2 目录列表框(1) 目录列表框(DirListBox)控件用于显示当前或指定的驱动器的全部目录结构,其显示方式是分层的文件夹(目录)列表,类似于Windows的“资源管理器”。目录列表框默认显示的是与当前目录相关的目录结构,通过双击列表中的一个目录项,就可以打开该目录项的第一级子目录,从而浏览到全部的目录结构,如图13.3所示。 图13.3 目录列表框
13.1.2 目录列表框(2) DirListBox控件的Path属性用来返回或设置当前的目录路径,其值是一个指示路径的字符串。例如,输出目录列表框控件Dir1中的当前目录路径: Print Dir1.Path 又如,将目录列表框控件Dir1中的当前目录路径设置为“e:\xwx2004”: Dir1.Path = "e:\xwx2004" 目录列表框的List属性数组中包含了所有的目录列表项目,访问该数组的方式与普通列表框控件类似,也是通过索引值ListIndex进行。
13.1.2 目录列表框(3) 目录列表框的索引值有以下特殊规定: (1)Path属性所指定的目录的索引值总是为-1,因此,通过Dir1.Path或Dir1.List(-1)都可以获得当前目录。 (2)紧邻当前目录之上的目录,其索引是-2,再上一个为-3,依次类推。 (3)紧邻当前目录下的第一个子目录,其索引是0;若有多个一级子目录,则每个子目录的索引分别是0、1、2、…,直到ListCount-1。因此ListCount属性表示当前目录下的一级子目录个数,而不是目录列表框中列出的所有项目。
13.1.2 目录列表框(4) 例如,一个目录列表框Dir1的索引值情况如图13.4所示,其中当前目录是“VB”,其下的一级子目录有3个,故Dir1.ListCount的值为3。 图13.4 目录列表框的索引值
13.1.2 目录列表框(5) 目录列表框的事件主要是Change事件和Click事件。单击目录列表框中的某个项目时,系统自动修改ListIndex属性值,同时触发Click事件。双击目录列表框中的某个项目时,自动设置Path属性为当前选择的目录,并修改ListIndex属性值为-1,同时触发Change事件。如果在代码中直接修改了Path属性的值,也会触发Change事件。 目录列表框的Change事件和Click事件之间没有冲突,但通常情况下,我们只对Change事件编程。 返回本节 返回首页
13.1.3 文件列表框(1) 文件列表框(FileListBox)控件根据指定的目录,在程序运行时自动显示该目录下所有文件的文件名。文件列表框的外观与普通列表框相似,如图13.5所示。 文件列表框的Path属性返回或设置当前指定的目录,一旦Path属性的值发生改变,文件列表框控件会自动刷新显示列表。 图13.5 文件列表框
13.1.3 文件列表框(2) FileName属性返回在文件列表框中选择的文件名。 Pattern属性指定文件列表框控件显示的文件类型,默认值为“*.*”,即显示所有类型的文件。如果要显示特定的文件类型,则可设置该属性。例如要显示扩展名为.txt的文件,可以将Pattern属性设置为“*.txt”。若需要同时显示多种类型的文件,则Pattern属性设置的文件类型要用分号分隔。例如设置Pattern属性为“*.txt ; *.doc”,表示显示扩展名为.txt和.doc的文件。
13.1.3 文件列表框(3) 文件列表框的List属性返回或设置控件列表中的文件名,这是一个数组,0是列表中第一个文件名的索引号;ListIndex属性代表当前选中文件名的索引号。假如File1是一个FileListBox控件,则File1.FileName与File1.List(File1.ListIndex)等价。 ListCount属性返回控件列表内文件名的个数。 文件列表框的事件主要是Click事件和DblClick事件。这两个事件以及List属性、ListIndex属性和ListCount属性的用法及作用与普通列表框相同。 返回本节 返回首页
13.1.4 文件系统控件的同步操作(1) 将上述三个文件系统控件组合起来,就可以查看整个驱动器文件系统,但要实现它们之间的同步显示,就需要编写特定的程序。下面我们通过一个例题说明如何实现三者之间的同步操作。 【例13.2】使用文件系统控件获得文件名及其路径。 在窗体上添加一个DriveListBox控件Drive1、DirListBox控件Dir1和FileListBox控件File1;再添加两个标签Label1、Label2,设其BorderStyle均为1(具有边框),Caption均为空,用来显示路径和文件名。
13.1.4 文件系统控件的同步操作(2) 设计的关键是,必须保证三个文件系统控件的相互协调联动。在程序的运行阶段,改变驱动器时,就会触发Drive1控件的Change事件,通过Dir1.Path = Drive1.Drive来改变Dir1的目录。当Dir1改变目录时,就会激活Dir1控件的Change事件,然后通过File1.Path = Dir1.Path来使File1控件显示改变目录后的文件列表。 另一个要注意的问题是File1的Path属性。按我们通常的想法,File1.Path与File1.FileName进行字符串连接后应该得到完整的文件路径和文件名,但实际上并非如此。
13.1.4 文件系统控件的同步操作(3) 如果选中的一个文件test.txt位于E:根目录下,File1的Path属性所取得的目录路径是"E:\",File1.Path与File1.FileName进行字符串连接后的结果是"E:\test.txt";然而,如果test.txt文件位于E:根目录下的user子目录下,则Path属性所取得的目录路径是"E:\user",File1.Path与File1.FileName连接后的结果是" E:\usertest.txt",显然出错。人为地在后一种情况下的路径后面加上“\”符号,既能够统一形式,也符合我们通常的习惯,避免出错。这便是本例中定义函数MakePath的原因。
图13.6 例13.2运行结果 13.1.4 文件系统控件的同步操作(3) 运行结果如图13.6 所示。
13.1.4 文件系统控件的同步操作(4) 代码如下: '自定义函数:生成以“\”结尾的路径字符串 Function MakePath(S As String) As String If Right(S, 1) = "\" Then MakePath = S Else MakePath = S & "\" End If End Function Private Sub Dir1_Change()'目录列表框 File1.Path = Dir1.Path'使文件列表框与目录列表框同步 End Sub
13.1.4 文件系统控件的同步操作(5) Private Sub Drive1_Change() '驱动器列表框 '设置错误捕获,避免软驱或光驱中无盘出错导致程序中断 On Error GoTo ErrDrive '使目录列表框与驱动器列表框同步 Dir1.Path = Drive1.Drive Exit Sub ErrDrive: MsgBox Drive1.Drive & " 驱动器未准备好。", _ vbCritical, "提示" End Sub Private Sub File1_Click() '文件列表框 Label1.Caption = MakePath(File1.Path) '显示路径 Label2.Caption = File1.FileName '显示文件名 End Sub
13.1.4 文件系统控件的同步操作(6) 常用文件处理语句和函数: (1)ChDrive语句 改变当前驱动器。例如,将当前驱动器改为应用程序(工程)所在驱动器: ChDrive App.Path 'App是VB默认的全局对象,指当前正在运行的应用程序或工程 (2)ChDir语句 改变驱动器的当前目录。例如: ChDir "E:\xwx2004" '改变E盘驱动器的当前目录。 ChDir "\book" '改变当前驱动器的当前目录。 ChDir App.Path '将当前目录设为应用程序(工程)所在目录
13.1.4 文件系统控件的同步操作(7) (3)MkDir语句 在指定的驱动器上创建一个新目录,如果不指定驱动器,则在当前驱动器上创建新目录。例如: 在当前驱动器上创建新目录: MkDir "VBtest" 在D盘驱动器根目录下创建新目录: MkDir "D:\test" (4)RmDir语句 RmDir语句的功能是删除一个存在的而且为空的目录,语法结构如下:
13.1.4 文件系统控件的同步操作(8) RmDir <目录或文件夹名> 其中,目录或文件夹名参数是一个字符串表达式,用来指定要删除的目录或文件夹。如果在参数中没有指定驱动器,则RmDir会在当前驱动器上执行删除操作。 (5)CurDir函数 CurDir函数返回当前目录。例如: 返回当前驱动器的当前目录:S1=CurDir()。 返回D盘驱动器上的当前目录: S2=CurDir("D:")。
13.1.4 文件系统控件的同步操作(9) (6)Dir函数 返回指定路径下的第一个子目录或文件,若再次调用,则返回该路径下的下一个子目录或文件。例如: 返回D盘驱动器上的第一个子目录: MyPath=Dir("D:\", vbDirectory) 其中vbDirectory是系统定义的VB常数,指定无属性文件及其路径和文件夹。 (7)Kill语句 Kill语句的功能是从磁盘中删除一个或多个文件,它的语法结构如下:
13.1.4 文件系统控件的同步操作(10) Kill <文件名> 其中,文件名参数是字符串表达式,可包含文件所在的目录以及驱动器。被删除的文件必须存在,否则会出现错误提示。Kill支持通配符*和?,可实现一次删除多个文件。要注意的是Kill语句正常执行时没有提示,为了避免误操作,用户应该在程序中执行Kill语句前加入自己的提示。例如: 删除D盘驱动器上根目录下的一个文件: Kill "D:\a.txt" 删除当前驱动器上当前目录下的多个.tmp文件: Kill "*.tmp"
13.1.4 文件系统控件的同步操作(11) (8)FileCopy 语句 FileCopy语句的功能是复制一个文件,语法结构如下: FileCopy <源文件名> , <目标文件名> 源文件名和目标文件名中都可以包含文件所在的目录以及驱动器。源文件必须存在,且目标文件名的路径也必须存在。例如: 将D盘根目录下的文件a.txt同名复制到C盘根目录下: FileCopy "D:\a.txt", "C:\a.txt"
13.1.4 文件系统控件的同步操作(12) 在当前目录下,将文件form1.frm复制成文件frmMain.frm: FileCopy "form1.frm", "frmMain.frm" (9)Name语句 Name语句的功能是重新命名一个文件,它的语法结构如下: Name <原文件名> As <新文件名> 原文件必须已经存在,新文件名不能与当前目录下的文件同名。当原文件名和新文件名相同且不在同一目录或分区时,将把原文件移动到新的目录下,原文件将被删除。
13.1.4 文件系统控件的同步操作(13) Name语句还能够对目录重命名。 例如,将D盘根目录下的文件a.txt改名为a.dat: Name "D:\a.txt" As "a.dat" 【例13.3】在例13.2的基础上,应用Kill语句和RmDir语句,实现删除一个非空目录的功能。 首先为例13.2的窗体添加两个命令按钮Command1和Command2,其Caption属性分别设为“删除文件”和“删除目录”,然后为Command1和Command2添加代码:
13.1.4 文件系统控件的同步操作(14) Private Sub Command1_Click() Str = MakePath(File1.Path) Kill Str & File1.FileName '删除一个文件 End Sub Private Sub Command2_Click() '删除目录下的所有文件 Kill MakePath(File1.Path) & "*.*" Rmdir Dir1.Path'删除空的目录 End Sub 返回本节 返回首页
13.2 用传统语句和函数访问文件 • 13.2.1 访问顺序文件 • 13.2.2 访问随机文件 • 13.2.3 访问二进制文件 返回首页
13.2.1 访问顺序文件 (1) 1.顺序文件的打开和关闭 (1)打开顺序文件使用Open语句,其语法结构如下: Open pathname For mode As # Filenumber 在Open语句的参数中,pathname指定文件路径和文件名;mode指定文件打开方式,对顺序文件有Append方式(向文件尾追加)、Input(从文件读取)、Output(向文件输出)方式;Filenumber是指定的一个有效的文件号,范围在1到511之间。
13.2.1 访问顺序文件 (2) 从文件中读取数据,应该以Input方式打开文件,并且文件必须已经存在;基于将文件作为输入设备的特点,可以用不同的文件号打开同一个文件。 把数据写入文件,应该以Output或Append方式打开文件;若文件不存在,Open语句会先创建该文件,然后再打开该文件;若文件存在,Output方式先清除文件内容,使之成为一个空文件,Append方式则保留原内容。
13.2.1 访问顺序文件 (3) 下面是几种使用Open语句的示例: 以顺序读模式打开C:\XU\testa.txt文件: Open "C:\XU\testa.txt" For Input As #1 以顺序写模式打开C:\XU\testa.txt文件: Open "C:\XU\testa.txt" For Output As #1 (2)关闭文件使用Close语句,语法格式如下: Close # Filenumber Close语句按文件号关闭文件,实际上,所有用Open语句打开的文件均使用该语句关闭。
13.2.1 访问顺序文件 (4) 例如:语句Close #1表示关闭文件号为1的文件;语句Close #2,#7,#8表示关闭文件号为2,7,8的文件;不带参数的语句Close表示关闭所有已打开的文件。 2.顺序文件的读操作 从顺序文件中读取数据,使用Input语句和Line Input语句。语法结构如下: Input # Filenumber, varlist Line Input # Filenumber, var
13.2.1 访问顺序文件 (5) 其中,Filenumber是指定的文件号;varlist可以是一个变量,也可以是用逗号分隔的变量列表;var是一个字符串变量。 Input语句和Line Input语句都可从指定的文件中读取数据值,分别赋值给指定的变量。不同的是Input语句一次读取一个数据项,Line Input语句一次读取一个数据行(不包括回车换行符)。 例如,如果顺序文件c:\score.dat的内容如下:
13.2.1 访问顺序文件 (6) "zhang","wang","li" 78,99,67 则执行程序段: Open "c:\score.dat" For Input As #1 Input #1, x, y, z Input #1, a, b, c Close #1 Print x, y, z Print a, b, c, a + b + c
13.2.1 访问顺序文件 (7) 在窗体上显示的内容为: zhang wang li 78 99 67 244 也可用Input()函数读取数据。该函数可以从文件中读取任意数量的字符,一次性地存入字符串变量中。它要求字符串变量具有足够大的空间。语法格式如下: 字符串变量 = Input(读出的字符数, Filenumber)
13.2.1 访问顺序文件 (8) 3.顺序文件的写操作 向顺序文件中写入数据,使用Write语句和Print # 语句。语法结构如下: Write #filenumber, outputlist Print #filenumber, outputlist 其中Filenumber是指定的文件号;outputlist是要写入文件的表达式,并可以含有Spc(n)、Tab(n)等函数,如果是多个表达式,则用逗号将这些表达式分隔开,若该参数为空,则将在文件中写入一空行。
13.2.1 访问顺序文件 (9) 用Write语句向顺序文件写入数据时,能自动在各数据项之间插入逗号,并给各字符串加上双引号。例如: Open "d:\shu.dat" For Output As #6 Write # 6, "zhang"; "wang"; "li" Write # 6, 78; 99; 67 Close #6 执行上面的程序段后,写入到文件d:\shu.dat中的数据如下: "zhang","wang","li" 78,99,67
13.2.1 访问顺序文件 (10) Print # 语句可以把格式化显示的数据写入到顺序文件中。例如: Open "d:\shu.dat" For Output As #2 Print # 2, "zhang"; "wang"; "li" Print # 2, 78; 99; 67 Close #2 执行以上程序段后,写入到文件中的数据如下: zhangwangli 78 99 67
13.2.1 访问顺序文件 (11) 4.文件的结束 读文件时,使用EOF函数可以判断是否已经到达了文件的结尾。对于以Input方式打开的顺序文件、以Random方式打开的随机文件,如果该函数返回值是True,则表明已经到达文件的结尾,此时再执行读操作,将引发错误。语法: X = EOF(filenumber) 【例13.4】编写学生成绩录入程序。可以在输入一个学生的姓名和成绩后,将其存入E:\Test.txt中,也可读出文件中保存的数据并显示出来。
13.2.1 访问顺序文件 (12) 用两个文本框Text1和Text2进行姓名和成绩的输入;用命令按钮cmdSave执行“写文件”操作;用命令按钮cmdRead执行“读文件”操作;用列表框List1显示读出的数据。运行情况如图13.7。 图13.7 例13.4运行结果
13.2.1 访问顺序文件 (13) 代码如下: Private Sub cmdSave_Click() ' 无姓名或无成绩时的输入无效 If Text1.Text = "" Or Text2.Text = "" Then Exit Sub End If ' 按追加方式打开文件,定为1号 Open "e:\test.txt" For Append As #1 ' 将文本框内容成对地写到1号文件中 Write #1, Text1.Text, Text2.Text Close #1 End Sub
13.2.1 访问顺序文件 (14) Private Sub cmdRead_Click() ' 定义存放姓名和成绩的变量 Dim name As String, score As String ' 按读方式打开文件,定为1号 Open "e:\test.txt" For Input As #1 List1.Clear ' 清空列表框 Do While Not EOF(1) ' 若1号文件还有数据则循环 Input #1, name, score ' 成对地读出数据(字符串) ' 将读出数据添加到列表框中 List1.AddItem name & "---" & score Loop Close #1 End Sub
13.2.1 访问顺序文件 (15) 有两点需要注意:一是录入的数据被成对地写到文件中,所以也相应的成对地读出,使得数据带有明显的含义。二是数据一经写入到顺序文件,便被转换为ASCII码字符,所以,从顺序文件中读出的数据也都是字符或字符串;对于读出的成绩字符串,应该使用函数Val( )将其转换为数值,以便进行数值运算。本例只是将其加入的List1的列表中,故没有进行数据类型的转换。 返回本节 返回首页
13.2.2 访问随机文件(1) 1.记录变量的声明 在存取随机文件的记录数据之前,首先应声明用来处理该文件数据所需的变量。通常是声明成用户自定义类型(称为记录类型)的变量,它对应着该文件中的记录。 注意:可以在标准模块中用Type语句声明公共的记录类型,如果在窗体的通用段定义记录类型,一定要使用带有Private关键字的Type语句,即声明成私有的记录类型。
13.2.2 访问随机文件(2) 例如,利用随机文件存放若干用户的编号、姓名、密码,则可以在窗体的通用段定义如下的记录类型Record,并声明Record类型的变量MyRecord: Private Type Record ' 定义记录类型 id As Integer ' 编号 name As String * 10 ' 姓名 pass As String * 10 ' 密码 End Type Dim MyRecord As Record' 声明变量
13.2.2 访问随机文件(3) 2.打开随机文件 打开随机文件也使用Open语句,语法格式如下: Open pathname For Random As #Filenumber Len = reclength 其中的关键字For Random表示随机访问方式,因为它是默认的访问类型,所以For Random关键字可以省略。表达式Len=reclength指定了每个记录的长度(字节数),可以用Len函数获得。例如: Open "e:\tool\pwfile.bin" For Random As #1 _ Len = Len(MyRecord)
13.2.2 访问随机文件(4) 3.读写随机文件 与顺序文件不同的是,随机文件打开后,可同时进行写入与读出操作。 使用Get语句把记录从文件复制到变量。使用Put语句把记录添加或者替换到随机文件。语法格式: Put # filenumber, Position, 记录变量 Get # filenumber, Position, 记录变量 Position的值表示文件中记录的记录号,取值1,2,……。
13.2.2 访问随机文件(5) 例如: 读入1号文件中的第4个记录数据,存放到MyRecord变量中: Get #1, 4, MyRecord 将MyRecord变量中的数据写入到1号文件的第1个记录上: Put #1, 1, MyRecord 添加新记录时,写入记录变量的位置Position应设置为文件中的记录数加1。例如,要在一个包含五个记录的文件中的添加一个记录,则把Position设置为6。