1 / 92

第13章 文件管理

第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的示意图中,左边是驱动器列表框的原始状态,右边是展开后的状态。.

kizzy
Download Presentation

第13章 文件管理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第13章 文件管理 • 13.1 文件系统控件 • 13.2 用传统语句和函数访问文件 • 13.3 文件系统对象 结束

  2. 13.1 文件系统控件 • 13.1.1 驱动器列表框 • 13.1.2 目录列表框 • 13.1.3 文件列表框 • 13.1.4 文件系统控件的同步操作 返回首页

  3. 13.1.1 驱动器列表框 (1) 驱动器列表框(DriveListBox)控件的作用是为用户提供一个选择有效磁盘驱动器的功能。该控件可以显示出用户系统中所有有效磁盘驱动器的列表。在图13.1的示意图中,左边是驱动器列表框的原始状态,右边是展开后的状态。 DriveListBox控件最重要的属性是Drive属性。程序运行时,可以通过该属性获得当前所选择的驱动器,也可以改变Drive属性的值,指定某个驱动器。 图13.1 驱动器列表框示意图

  4. 13.1.1 驱动器列表框 (2) 例如: 将驱动器列表框Drive1中所选择的驱动器显示在文本框Text1中: Text1.Text = Drive1.Drive 将驱动器列表框Drive1中的驱动器设置为“e:\”: Drive1.Drive = "e:\" 访问驱动器列表框中的列表项目时,其方式与普通列表框控件类似,即可以使用List属性数组访问;ListCount表示列表项目的个数;ListIndex表示当前选中的项目在列表中的索引位置。

  5. 13.1.1 驱动器列表框 (3) 驱动器列表框的主要事件是Change事件。在程序的运行阶段,如果选择了一个驱动器列表项目,或者通过代码改变了Drive属性的值,均将引发控件的Change事件。 【例13.1】将系统的驱动器信息收集到一个列表框中,若在驱动器列表框中选择了一个驱动器,则列表框中的相应驱动器也要被选中。 在窗体上添加一个驱动器列表框Drive1。添加一个普通列表框List1,设其Style属性为1(带有复选框)。设窗体的Caption为“驱动器列表框示例”。

  6. 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 返回本节 返回首页

  7. 13.1.2 目录列表框(1) 目录列表框(DirListBox)控件用于显示当前或指定的驱动器的全部目录结构,其显示方式是分层的文件夹(目录)列表,类似于Windows的“资源管理器”。目录列表框默认显示的是与当前目录相关的目录结构,通过双击列表中的一个目录项,就可以打开该目录项的第一级子目录,从而浏览到全部的目录结构,如图13.3所示。 图13.3 目录列表框

  8. 13.1.2 目录列表框(2) DirListBox控件的Path属性用来返回或设置当前的目录路径,其值是一个指示路径的字符串。例如,输出目录列表框控件Dir1中的当前目录路径: Print Dir1.Path 又如,将目录列表框控件Dir1中的当前目录路径设置为“e:\xwx2004”: Dir1.Path = "e:\xwx2004" 目录列表框的List属性数组中包含了所有的目录列表项目,访问该数组的方式与普通列表框控件类似,也是通过索引值ListIndex进行。

  9. 13.1.2 目录列表框(3) 目录列表框的索引值有以下特殊规定: (1)Path属性所指定的目录的索引值总是为-1,因此,通过Dir1.Path或Dir1.List(-1)都可以获得当前目录。 (2)紧邻当前目录之上的目录,其索引是-2,再上一个为-3,依次类推。 (3)紧邻当前目录下的第一个子目录,其索引是0;若有多个一级子目录,则每个子目录的索引分别是0、1、2、…,直到ListCount-1。因此ListCount属性表示当前目录下的一级子目录个数,而不是目录列表框中列出的所有项目。

  10. 13.1.2 目录列表框(4) 例如,一个目录列表框Dir1的索引值情况如图13.4所示,其中当前目录是“VB”,其下的一级子目录有3个,故Dir1.ListCount的值为3。 图13.4 目录列表框的索引值

  11. 13.1.2 目录列表框(5) 目录列表框的事件主要是Change事件和Click事件。单击目录列表框中的某个项目时,系统自动修改ListIndex属性值,同时触发Click事件。双击目录列表框中的某个项目时,自动设置Path属性为当前选择的目录,并修改ListIndex属性值为-1,同时触发Change事件。如果在代码中直接修改了Path属性的值,也会触发Change事件。 目录列表框的Change事件和Click事件之间没有冲突,但通常情况下,我们只对Change事件编程。 返回本节 返回首页

  12. 13.1.3 文件列表框(1) 文件列表框(FileListBox)控件根据指定的目录,在程序运行时自动显示该目录下所有文件的文件名。文件列表框的外观与普通列表框相似,如图13.5所示。 文件列表框的Path属性返回或设置当前指定的目录,一旦Path属性的值发生改变,文件列表框控件会自动刷新显示列表。 图13.5 文件列表框

  13. 13.1.3 文件列表框(2) FileName属性返回在文件列表框中选择的文件名。 Pattern属性指定文件列表框控件显示的文件类型,默认值为“*.*”,即显示所有类型的文件。如果要显示特定的文件类型,则可设置该属性。例如要显示扩展名为.txt的文件,可以将Pattern属性设置为“*.txt”。若需要同时显示多种类型的文件,则Pattern属性设置的文件类型要用分号分隔。例如设置Pattern属性为“*.txt ; *.doc”,表示显示扩展名为.txt和.doc的文件。

  14. 13.1.3 文件列表框(3) 文件列表框的List属性返回或设置控件列表中的文件名,这是一个数组,0是列表中第一个文件名的索引号;ListIndex属性代表当前选中文件名的索引号。假如File1是一个FileListBox控件,则File1.FileName与File1.List(File1.ListIndex)等价。 ListCount属性返回控件列表内文件名的个数。 文件列表框的事件主要是Click事件和DblClick事件。这两个事件以及List属性、ListIndex属性和ListCount属性的用法及作用与普通列表框相同。 返回本节 返回首页

  15. 13.1.4 文件系统控件的同步操作(1) 将上述三个文件系统控件组合起来,就可以查看整个驱动器文件系统,但要实现它们之间的同步显示,就需要编写特定的程序。下面我们通过一个例题说明如何实现三者之间的同步操作。 【例13.2】使用文件系统控件获得文件名及其路径。 在窗体上添加一个DriveListBox控件Drive1、DirListBox控件Dir1和FileListBox控件File1;再添加两个标签Label1、Label2,设其BorderStyle均为1(具有边框),Caption均为空,用来显示路径和文件名。

  16. 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进行字符串连接后应该得到完整的文件路径和文件名,但实际上并非如此。

  17. 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的原因。

  18. 图13.6 例13.2运行结果 13.1.4 文件系统控件的同步操作(3) 运行结果如图13.6 所示。

  19. 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

  20. 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

  21. 13.1.4 文件系统控件的同步操作(6) 常用文件处理语句和函数: (1)ChDrive语句 改变当前驱动器。例如,将当前驱动器改为应用程序(工程)所在驱动器: ChDrive App.Path 'App是VB默认的全局对象,指当前正在运行的应用程序或工程 (2)ChDir语句 改变驱动器的当前目录。例如: ChDir "E:\xwx2004" '改变E盘驱动器的当前目录。 ChDir "\book" '改变当前驱动器的当前目录。 ChDir App.Path '将当前目录设为应用程序(工程)所在目录

  22. 13.1.4 文件系统控件的同步操作(7) (3)MkDir语句 在指定的驱动器上创建一个新目录,如果不指定驱动器,则在当前驱动器上创建新目录。例如: 在当前驱动器上创建新目录: MkDir "VBtest" 在D盘驱动器根目录下创建新目录: MkDir "D:\test" (4)RmDir语句 RmDir语句的功能是删除一个存在的而且为空的目录,语法结构如下:

  23. 13.1.4 文件系统控件的同步操作(8) RmDir <目录或文件夹名> 其中,目录或文件夹名参数是一个字符串表达式,用来指定要删除的目录或文件夹。如果在参数中没有指定驱动器,则RmDir会在当前驱动器上执行删除操作。 (5)CurDir函数 CurDir函数返回当前目录。例如: 返回当前驱动器的当前目录:S1=CurDir()。 返回D盘驱动器上的当前目录: S2=CurDir("D:")。

  24. 13.1.4 文件系统控件的同步操作(9) (6)Dir函数 返回指定路径下的第一个子目录或文件,若再次调用,则返回该路径下的下一个子目录或文件。例如: 返回D盘驱动器上的第一个子目录: MyPath=Dir("D:\", vbDirectory) 其中vbDirectory是系统定义的VB常数,指定无属性文件及其路径和文件夹。 (7)Kill语句 Kill语句的功能是从磁盘中删除一个或多个文件,它的语法结构如下:

  25. 13.1.4 文件系统控件的同步操作(10) Kill <文件名> 其中,文件名参数是字符串表达式,可包含文件所在的目录以及驱动器。被删除的文件必须存在,否则会出现错误提示。Kill支持通配符*和?,可实现一次删除多个文件。要注意的是Kill语句正常执行时没有提示,为了避免误操作,用户应该在程序中执行Kill语句前加入自己的提示。例如: 删除D盘驱动器上根目录下的一个文件: Kill "D:\a.txt" 删除当前驱动器上当前目录下的多个.tmp文件: Kill "*.tmp"

  26. 13.1.4 文件系统控件的同步操作(11) (8)FileCopy 语句 FileCopy语句的功能是复制一个文件,语法结构如下: FileCopy <源文件名> , <目标文件名> 源文件名和目标文件名中都可以包含文件所在的目录以及驱动器。源文件必须存在,且目标文件名的路径也必须存在。例如: 将D盘根目录下的文件a.txt同名复制到C盘根目录下: FileCopy "D:\a.txt", "C:\a.txt"

  27. 13.1.4 文件系统控件的同步操作(12) 在当前目录下,将文件form1.frm复制成文件frmMain.frm: FileCopy "form1.frm", "frmMain.frm" (9)Name语句 Name语句的功能是重新命名一个文件,它的语法结构如下: Name <原文件名> As <新文件名> 原文件必须已经存在,新文件名不能与当前目录下的文件同名。当原文件名和新文件名相同且不在同一目录或分区时,将把原文件移动到新的目录下,原文件将被删除。

  28. 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添加代码:

  29. 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 返回本节 返回首页

  30. 13.2 用传统语句和函数访问文件 • 13.2.1 访问顺序文件 • 13.2.2 访问随机文件 • 13.2.3 访问二进制文件 返回首页

  31. 13.2.1 访问顺序文件 (1) 1.顺序文件的打开和关闭 (1)打开顺序文件使用Open语句,其语法结构如下: Open pathname For mode As # Filenumber 在Open语句的参数中,pathname指定文件路径和文件名;mode指定文件打开方式,对顺序文件有Append方式(向文件尾追加)、Input(从文件读取)、Output(向文件输出)方式;Filenumber是指定的一个有效的文件号,范围在1到511之间。

  32. 13.2.1 访问顺序文件 (2) 从文件中读取数据,应该以Input方式打开文件,并且文件必须已经存在;基于将文件作为输入设备的特点,可以用不同的文件号打开同一个文件。 把数据写入文件,应该以Output或Append方式打开文件;若文件不存在,Open语句会先创建该文件,然后再打开该文件;若文件存在,Output方式先清除文件内容,使之成为一个空文件,Append方式则保留原内容。

  33. 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语句打开的文件均使用该语句关闭。

  34. 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

  35. 13.2.1 访问顺序文件 (5) 其中,Filenumber是指定的文件号;varlist可以是一个变量,也可以是用逗号分隔的变量列表;var是一个字符串变量。 Input语句和Line Input语句都可从指定的文件中读取数据值,分别赋值给指定的变量。不同的是Input语句一次读取一个数据项,Line Input语句一次读取一个数据行(不包括回车换行符)。 例如,如果顺序文件c:\score.dat的内容如下:

  36. 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

  37. 13.2.1 访问顺序文件 (7) 在窗体上显示的内容为: zhang wang li 78 99 67 244 也可用Input()函数读取数据。该函数可以从文件中读取任意数量的字符,一次性地存入字符串变量中。它要求字符串变量具有足够大的空间。语法格式如下: 字符串变量 = Input(读出的字符数, Filenumber)

  38. 13.2.1 访问顺序文件 (8) 3.顺序文件的写操作 向顺序文件中写入数据,使用Write语句和Print # 语句。语法结构如下: Write #filenumber, outputlist Print #filenumber, outputlist 其中Filenumber是指定的文件号;outputlist是要写入文件的表达式,并可以含有Spc(n)、Tab(n)等函数,如果是多个表达式,则用逗号将这些表达式分隔开,若该参数为空,则将在文件中写入一空行。

  39. 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

  40. 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

  41. 13.2.1 访问顺序文件 (11) 4.文件的结束 读文件时,使用EOF函数可以判断是否已经到达了文件的结尾。对于以Input方式打开的顺序文件、以Random方式打开的随机文件,如果该函数返回值是True,则表明已经到达文件的结尾,此时再执行读操作,将引发错误。语法: X = EOF(filenumber) 【例13.4】编写学生成绩录入程序。可以在输入一个学生的姓名和成绩后,将其存入E:\Test.txt中,也可读出文件中保存的数据并显示出来。

  42. 13.2.1 访问顺序文件 (12) 用两个文本框Text1和Text2进行姓名和成绩的输入;用命令按钮cmdSave执行“写文件”操作;用命令按钮cmdRead执行“读文件”操作;用列表框List1显示读出的数据。运行情况如图13.7。 图13.7 例13.4运行结果

  43. 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

  44. 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

  45. 13.2.1 访问顺序文件 (15) 有两点需要注意:一是录入的数据被成对地写到文件中,所以也相应的成对地读出,使得数据带有明显的含义。二是数据一经写入到顺序文件,便被转换为ASCII码字符,所以,从顺序文件中读出的数据也都是字符或字符串;对于读出的成绩字符串,应该使用函数Val( )将其转换为数值,以便进行数值运算。本例只是将其加入的List1的列表中,故没有进行数据类型的转换。 返回本节 返回首页

  46. 13.2.2 访问随机文件(1) 1.记录变量的声明 在存取随机文件的记录数据之前,首先应声明用来处理该文件数据所需的变量。通常是声明成用户自定义类型(称为记录类型)的变量,它对应着该文件中的记录。 注意:可以在标准模块中用Type语句声明公共的记录类型,如果在窗体的通用段定义记录类型,一定要使用带有Private关键字的Type语句,即声明成私有的记录类型。

  47. 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' 声明变量

  48. 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)

  49. 13.2.2 访问随机文件(4) 3.读写随机文件 与顺序文件不同的是,随机文件打开后,可同时进行写入与读出操作。 使用Get语句把记录从文件复制到变量。使用Put语句把记录添加或者替换到随机文件。语法格式: Put # filenumber, Position, 记录变量 Get # filenumber, Position, 记录变量 Position的值表示文件中记录的记录号,取值1,2,……。

  50. 13.2.2 访问随机文件(5) 例如: 读入1号文件中的第4个记录数据,存放到MyRecord变量中: Get #1, 4, MyRecord 将MyRecord变量中的数据写入到1号文件的第1个记录上: Put #1, 1, MyRecord 添加新记录时,写入记录变量的位置Position应设置为文件中的记录数加1。例如,要在一个包含五个记录的文件中的添加一个记录,则把Position设置为6。

More Related