1 / 64

第12章 文 件

本章要点: • 文件的基本概念 • 顺序文件 • 随机文件 • 文件系统控件 • 文件系统对象模型. 第12章 文 件. 12.1 文件的基本概念. 文件: 是指存储在外部介质上的数据的集合。 分类: 从文件内容分 — 程序文件、数据文件 按存取方式分 — 顺序文件、随机文件、二进制文件 顺序文件: 普通的纯文本文件。 查找数据必须按记录顺序进行。 不能同时进行读写操作。 随机文件: 以固定长度的记录为单位进行存储。

Télécharger la présentation

第12章 文 件

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. 本章要点: • 文件的基本概念 • 顺序文件 • 随机文件 • 文件系统控件 • 文件系统对象模型 第12章 文 件

  2. 12.1 文件的基本概念 • 文件: 是指存储在外部介质上的数据的集合。 • 分类: • 从文件内容分—程序文件、数据文件 • 按存取方式分—顺序文件、随机文件、二进制文件 顺序文件: 普通的纯文本文件。 查找数据必须按记录顺序进行。 不能同时进行读写操作。 随机文件: 以固定长度的记录为单位进行存储。 可以按任意顺序访问其中的数据。 可以同时进行读写操作。 不能用字处理软件查看。 二进制文件: 以字节为单位进行访问。 不能用字处理软件查看。

  3. 12.1 顺序文件 顺序文件: ASCII文件 由任何字处理软件建立、在VB中建立 只能按顺序存取记录 例: 文件AA.DAT内容如下: "zhang san","85","90" "li si","70","66" "wang wu","90","89" 记录: 行 域: 字段,数据项 顺序文件操作: 打开文件、读或写文件、关闭文件

  4. 12.1 顺序文件 • 12.2.1 顺序文件的打开和关闭 1. 顺序文件的打开 使用之前必须先打开 格式:Open <文件名> FOR <方式> AS[#]<文件号> 功能:按指定的方式打开文件,并指定一文件号。 <方式>: Input—以只读方式打开。当文件不存在时出错。 Output —以写方式打开。 如果文件不存在,则创建一个新文件。 如果文件已经存在,则删除原数据。 Append—以添加方式打开文件。 如果文件不存在,就创建一个新的文件。 如果文件已经存在,写数据时从文件尾开始进行添加。 <文件号> : 1到511之间的整数。

  5. 12.1 顺序文件 例: (1) 在C盘Data文件夹下建立一个名为stud.dat的文件 Open "c:\Data\stud.dat" For Output As #1 (2) 打开当前盘当前文件夹下的salary.dat文件,以便从中读取数据 Open "salary.dat" For Input As #8 (3) 打开C盘Data文件夹下名为stud.dat的文件,以便在文件末尾添加数据 Open "c:\Data\stud.dat" For Append As 2

  6. 12.1 顺序文件 2. 顺序文件的关闭 完成文件操作后,要关闭打开的文件。 格式: Close [<文件号列表>] 其中: <文件号列表>缺省时关闭所有打开的文件。 例: (1) 关闭文件号为1的文件 Close #1 (2) 关闭文件号为1、2、8的文件 Close #1, 2, #8 ' 文件号前的“#”号可以省略 (3) 关闭所有打开的文件 Close

  7. 12.1 顺序文件 12.2.2 顺序文件的读写 • 1. 顺序文件的写操作 (1) Write #语句 格式: Write #<文件号>,[<输出列表>] 功能: 将<输出列表>的内容写入指定的文件中。 说明: •<输出列表>中各项之间要用逗号分开 •<输出列表>每一项可以是常量、变量或表达式。 • 写到文件中的各数据间自动插入逗号,字符串自动加上双引号 • 所有数据写完后,在最后加入一个回车换行符。 • 不含<输出列表>的Write #语句,将在文件中写入一空行

  8. Text1 Text2 Text3 Text4 CommonDialog1 Command2 Command1 12.1 顺序文件 【例12-1】建立一个新的学生成绩文件,将输入的学生成绩添加到文件中。界面如下图。

  9. 12.1 顺序文件 与Append的区别? Private Sub Form_Load() CommonDialog1.ShowSave Open CommonDialog1.FileName For Output As #2 End Sub Private Sub Command1_Click() ' 添加 no = Text1.Text : na = Text2.Text g1 = Val(Text3.Text) : g2 = Val(Text4.Text) Write #2, no, na, g1, g2 Text1.Text = "" : Text2.Text = "" Text3.Text = "" : Text4.Text = "" End Sub Private Sub Command2_Click() ' 退出 Close #2 End End Sub

  10. 12.1 顺序文件 (2) Print #语句 格式: Print #<文件号>,<输出列表> 功能:将<输出列表>的内容写入指定的文件中。 说明: •当<输出列表>用逗号分隔时,采用分区格式输出; •当<输出列表>用分号分隔时,采用紧凑格式输出。 •所有项将在一行内输出,输出后将自动换行。 •可以使用Spc()函数和Tab()函数。 将例12-1中的Write #语句改用Print #语句: Print #2, no, na, g1, g2

  11. 12.1 顺序文件 用Write #语句生成的数据: "001","张三",87,92 "002","李四",76,89 "003","王五",93,86 用Print #语句(使用逗号分隔符)产生的数据: 001 张三 87 92 002 李四 76 89 003 王五 93 86 用Print #语句(使用分号分隔符)产生的数据: 001张三 87 92 002李四 76 89 003王五 93 86

  12. 12.1 顺序文件 • 2. 顺序文件的读操作 (1) Input #语句 格式: Input #<文件号>,<变量列表> 功能: 从文件中读取数据,并按顺序给变量列表中的变量赋值。 说明: 常用于读取用Write语句生成的文件数据。 按顺序读,每读完一条记录,记录指针向后移动一条记录。

  13. Text1 CommonDialog1 Command1 12.1 顺序文件 • 【例12-2】读入上例生成的文件,并计算每个学生的平均成绩,界面如下,其中,通用对话框控件用于打开一个“打开文件”对话框,在对话框中所选择的文件将作为要显示的文件。

  14. 12.1 顺序文件 Private Sub Command1_Click() CommonDialog1.ShowOpen Open CommonDialog1.FileName For Input As #3 Text1.Text = "" Do While Not EOF(3) ' 装入用Write #语句生成的文件 Input #3, num, nam, s1, s2 ave = (s1 + s2) / 2 Text1.Text = Text1.Text & num & " " & nam _ & " " & Str(s1) & " " & Str(s2) & _ " " & Str(ave) & Chr(13) & Chr(10) Loop Close #3 End Sub

  15. 12.1 顺序文件 (2) Line Input #语句 格式: Line Input #<文件号>,<变量名> 功能: 从文件中读取一行数据,作为字符串存放在 <变量名>中。 (3) Input函数 格式: <变量名>=Input(整数,[#]<文件号>) 功能: 从指定文件的当前位置一次读取指定个数的字符,并赋值给变量。 (4) InputB函数 格式: <变量名>=InputB(字节数,[#]<文件号>) 功能: 从指定文件的当前位置一次读取指定字节数的数据,并赋值给变量。

  16. Text1 Text2 CommonDialog1 12.1 顺序文件 • EOF函数: 在读顺序文件时,常用EOF函数判断是否已读到了文件尾。格式为: EOF(<文件号>)。 当到达文件的结尾时, EOF函数返回True。否则返回False。 • 【例12-3】读取例12-1生成的学生成绩文件,计算每个学生的平均成绩,计算每门课的平均成绩,将结果显示于文本框中,同时将计算结果与原数据保存于另外一个指定的文件中,设计界面如下图所示。

  17. 学号NUM 姓名NAM 成绩G 数学G(N,1) 英语G(N,2) NUM(1) NAM(1) G(1,1) G(1,2) NUM(2) NAM(2) G(2,1) G(2,2) NUM(2) NAM(3) G(3,1) G(3,2) …… …… …… …… NUM(N) NAM(N) G(N,1) G(N,2) 12.1 顺序文件 分析: 设立三个数组: 学号、姓名、成绩

  18. 12.1 顺序文件 Dim Num(100) As String, Nam(100) As String Dim G(100, 2) As Integer, N As Integer Private Sub Command1_Click() ' 装入数据 CommonDialog1.ShowOpen Open CommonDialog1.FileName For Input As #3 N = 0 Do While Not EOF(3) N = N + 1 Input #3, Num(N), Nam(N), G(N, 1), G(N, 2) Text1.Text = Text1.Text & " " & Num(N) & _ " " & Nam(N) & " " & Str(G(N, 1)) & _ " " & Str(G(N, 2)) & " " & Chr(13) & Chr(10) Loop End Sub

  19. 12.1 顺序文件 Private Sub Command2_Click() ' 计算平均 CommonDialog1.ShowSave Open CommonDialog1.FileName For Output As #4 SUM1 = 0 SUM2 = 0 Text2.Text = "" For i = 1 To N Ave = (G(i, 1) + G(i, 2)) / 2 Write #4, Num(i), Nam(i), G(i, 1), G(i, 2), Ave Text2.Text = Text2.Text & " " & Num(i) & _ " " & Nam(i) & " " & Str(G(i, 1)) & " " & _ Str(G(i, 2)) & " " & Str(Ave) & Chr(13) SUM1 = SUM1 + G(i, 1): SUM2 = SUM2 + G(i, 2) Next i

  20. 12.1 顺序文件 Text2.Text = Text2.Text & " 总平均" & "" & _ Str(SUM1 / N) & " " & Str(SUM2 / N) Write #4, "总平均", SUM1 / N, SUM2 / N End Sub Private Sub Command3_Click() ' 退出 Close #3, #4 End End Sub

  21. 12.3 随机文件 随机文件特点: 读写次序任意、记录长度相等 随机文件中的记录常定义为用户自定义类型。 • 1. 用户自定义类型 [Private|Public] Type <自定义类型名> <元素名>[(下标)] As <类型> [<元素名>[(下标)] As <类型>] … End Type 说明: (1) <自定义类型名>、<元素名>遵循变量的命名规则。 (2) <类型>可以是VB系统提供的基本数据类型或已声明的自定义类型。

  22. 12.1 顺序文件 (3) 缺省[Private|Public]选项时,默认为Public。 必须在窗体模块或标准模块的“通用”位置的声明段进行声明。 在窗体模块中定义时必须使用Private关键字。 (4) 如果自定义类型的一个元素为数组,则其下标的下界不受Option Base语句的限制。 (5) 在使用自定义类型前,必须先声明自定义类型的变量。 (6) 引用自定义类型元素,使用如下格式: <自定义类型变量名>.<元素名>

  23. 12.1 顺序文件 • 例: 在窗体的声明段中定义如下的Students类型用来存放学生的信息,并声明一个Students类型的变量。在窗体的Load事件过程中,实现对变量的每个元素赋值。单击窗体输出自定义类型变量各元素的值。代码如下: Private Type Students Dept As String * 20 ' 系 ClassNo As String * 10 ' 班级 Name As String ' 姓名 Age As Integer ' 年龄 End Type Dim Stud As Students ' 声明一个自定义类型变量

  24. 12.1 顺序文件 Private Sub Form_Load() ' 给变量的每个元素赋值 Stud.Dept = "计算机系" Stud.ClassNo = "软件2001-1" Stud.Name = "张三" Stud.Age = 18 End Sub Private Sub Form_Click() Print Stud.Dept ' 输出每个元素的值 Print Stud.ClassNo, Stud.Name, Stud.Age End Sub

  25. 12.1 顺序文件 • 12.3.1 随机文件的打开和关闭 • 1. 随机文件的打开 使用之前必须先打开文件 格式: Open <文件名> [For Random] As <文件号> Len = <记录长度> 说明: (1) For Random表示打开随机文件,可以省略。 (2) <记录长度>: 通常就是自定义类型的大小,可用Len函数获得。 (3) 若文件不存在,则建立一个新的文件。 • 2. 随机文件的关闭 Close语句

  26. 12.1 顺序文件 • 12.3.2 随机文件的读写 • 1. 写文件 格式: Put [#]<文件号>,[<记录号>],<变量名> 功能: 将一个变量的数据写入随机文件中。 说明: (1) <记录号>: 若文件中已有此记录,则该记录将被新数据覆盖;若文件中无此记录,则在文件中添加一条新记录。 如果省略<记录号>,则写入数据的记录号为上次读或写的记录的记录号加1。 (2) <变量名>: 通常是一个自定义类型的变量,也可以是其他类型的变量。

  27. 12.1 顺序文件 • 2. 读文件 格式: Get [#]<文件号>,[<记录号>],<变量名> 功能: 将一个已打开的随机文件读入一个变量之中。 【例12-4】建立学生成绩随机文件。界面如下图。

  28. 12.1 顺序文件 Private Type StudRec No As String * 6 Name As String * 8 Math As Integer English As Integer End Type Dim StudTab As StudRec Private Sub Form_Load() CommonDialog1.ShowSave Open CommonDialog1.FileName For Random As #1 Len = Len(StudTab) End Sub

  29. 12.1 顺序文件 Private Sub Command1_Click() StudTab.No = Text1.Text StudTab.Name = Text2.Text StudTab.Math = Val(Text3.Text) StudTab.English = Val(Text4.Text) Put #1, , StudTab Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" End Sub Private Sub Command2_Click() Close #1 End End Sub

  30. 12.4 文件系统控件 • 驱动器列表框(DriveListBox) • 目录列表框(DirListBox) • 文件列表框(FileListBox) • 作用: 获取有关驱动器、目录和文件的当前状态

  31. 12.4 文件系统控件 • 12.4.1 驱动器列表框(DriveListBox) 显示系统中所有有效磁盘驱动器 1. 属性: Drive—返回或设置驱动器名称 只能在运行时设置,值—A: C: D: E: 等 例: Drive1.Drive="c:" 注意: 改变Drive属性并不能自动变更当前驱动器, 要改变当前驱动器需使用 ChDrive 语句。 例: ChDrive "D:" 例: ChDrive Drive1.Drive 2. 事件: Change—当选择一个新驱动器或通过代码 改变 Drive 属性时发生。 例: 将选择的驱动器设置为当前驱动器: Private Sub Drive1_Change() ChDrive Drive1.Drive End Sub

  32. 12.4 文件系统控件 • 12.4.2 目录列表框(DirListBox) • 显示一个树型的目录结构 • 1. 属性: Path—设置或返回当前工作目录的完整路径(包括驱动器盘符) 例: Dir1.Path = "c:\winnt" 注意: 在目录列表框中选择目录不能改变当前目录, 要真正改变当前目录需使用ChDir语句。 例: ChDir "c:\system" • 例: ChDir Dir1.Path • 2. 事件Change—当双击一个目录项或通过代码改变 Path 属性时发生。 例: 将选择的路径设置为当前路径 Private Sub Dir1_Change() ChDir Dir1.Path End Sub

  33. 12.4 文件系统控件 • 12.4.3 文件列表框(FileListBox) 显示特定目录下的文件。 • 1. 属性 (1) Path 设置或返回当前工作目录的完整路径。 (2) FileName 设置或返回所选文件的路径和文件名。 设置时: 文件名可以带路径 返回时: 文件名不含路径名 (3) Pattern:设置对显示文件的过滤。 例: Filelistbox1.Pattern= "*.EXE ; *.COM " 只显示以 .EXE和 .COM为后缀的文件 • 2. 事件 Click 和DblClick事件

  34. Drive2 Drive1 Dir1 Dir2 File1 File2 12.4 文件系统控件 • 【例12-5】使用以下界面进行文件的复制和删除。

  35. 12.4 文件系统控件 Private Sub Drive1_Change() ChDrive Drive1.Drive Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() ChDir Dir1.Path File1.FileName = Dir1.Path End Sub Private Sub Drive2_Change() ChDrive Drive2.Drive Dir2.Path = Drive2.Drive End Sub Private Sub Dir2_Change() ChDir Dir2.Path File2.FileName = Dir2.Path End Sub

  36. 12.4 文件系统控件 Private Sub Command1_Click() ' 复制 If File1.FileName = "" Then MsgBox "请选择文件" Exit Sub End If srcfile = Dir1.Path & "\" & File1.FileName If File2.FileName = "" Then desfile = Dir2.Path & "\" & File1.FileName Else desfile = Dir2.Path & "\" & File2.FileName End If FileCopy srcfile, desfile File1.Refresh File2.Refresh End Sub

  37. 12.4 文件系统控件 Private Sub Command2_Click() ' 移动 If File1.FileName = "" Then MsgBox "请选择文件" Exit Sub End If srcfile = Dir1.Path & "\" & File1.FileName If File2.FileName = "" Then desfile = Dir2.Path & "\" & File1.FileName Else desfile = Dir2.Path & "\" & File2.FileName End If FileCopy srcfile, desfile Kill srcfile File1.Refresh File2.Refresh End Sub

  38. 12.4 文件系统控件 Private Sub Command3_Click() ' 删除 If File1.FileName = "" Then MsgBox "请选择源文件" Exit Sub End If srcfile = Dir1.Path & "\" & File1.FileName Kill srcfile File1.Refresh File2.Refresh End Sub

  39. 12.5 文件系统对象模型(FSO) 通过对象提供的属性和方法来操纵和管理文件系统。 • 12.5.1 文件系统对象模型概述 • 1. FSO对象模型的主要对象 (1) FileSystemObject—核心对象。提供了一整套用于创建、删除、收集相关信息,以及通常的操作驱动器、文件夹和文件的方法。 (2) Drive—用来收集系统所用的驱动器的信息。 (3) Folder—提供对一个文件夹所有属性的访问(查询文件夹的名称、路径等)。也允许使用适当的方法创建、删除或移动文件夹。 (4) File—提供对文件所有属性的访问(查询文件的名称、路径等),也可以使用适当的方法创建、删除或移动文件。 (5) TextStream—允许用户读和写文本文件。

  40. 12.5 文件系统对象模型(FSO) • 2. 使用FSO对象模型编程的主要步骤 (1) 创建FileSystemObject对象。 (2) 根据编程需要,有两种选择: •对FileSystemObject对象使用适当的方法生成用于管理驱动器、文件夹和文件的对象(如Drive对象、Folder对象、File对象);用新创建的对象进行文件和文件夹的复制、移动、删除。 •使用FileSystemObject对象的方法,进行文件或文件夹的创建、复制、移动、删除。再生成用于管理驱动器、文件夹和文件的对象(如Drive对象、Folder对象、File对象)来实现其他功能。 (3) 访问步骤2生成的新对象的属性,来获取文件系统的信息(如文件名称、大小等)。

  41. 12.5 文件系统对象模型(FSO) • 3. FileSystemObject对象的创建 创建FileSystemObject对象主要有二种方法: (1) 使用New关键字,将一个变量声明为 FileSystemObject对象类型。 例: Dim fso As New FileSystemObject (2) 使用CreateObject函数创建一个FileSystemObject对象。 例: Set fso = CreateObject("Scripting.FileSystemObject")

  42. 12.5 文件系统对象模型(FSO) • 3. 说明 (1) FSO对象目前不支持对二进制文件和随机文件的访问,只能通过TextStream对象读写纯文本文件。 (2) FileSystemObject对象提供了许多与其他对象相同的功能,如FileSystemObject对象的CopyFile方法与File对象的Copy方法功能一样。编程时可以任选一种方法使用。

  43. 12.5 文件系统对象模型(FSO) • 12.5.2 管理驱动器 功能: 读取系统本地驱动器的信息,获得网络驱动器的信息等。 使用Drive对象管理驱动器。 Drive对象的属性见书上P227表12-2。 【例12-6】调用Drive对象的属性获得驱动器的信息 Private Sub Command1_Click() ' 创建一个FileSystemObject对象fso Dim fso As New FileSystemObject ' 将变量drv声明为Drive对象类型 Dim drv As Drive, s_string As String ' 返回一个Drive对象 Set drv = fso.GetDrive("C:")

  44. 12.5 文件系统对象模型(FSO) ' 调用Drive对象的属性获得驱动器信息 s_string = "驱动器 " & ("C:") & vbCrLf s_string = s_string & "磁盘总容量:" & _ FormatNumber(drv.TotalSize / 1024, 0) s_string = s_string & " Kb" & vbCrLf s_string = s_string & "剩余空间:" & _ FormatNumber(drv.FreeSpace / 1024, 0) s_string = s_string & " Kb" & vbCrLf MsgBox s_string End Sub

  45. 12.5 文件系统对象模型(FSO) • 12.5.3 管理文件夹 功能:文件夹的创建、复制、移动、删除及获取与文件夹有关的信息 使用FileSystemObject对象和Folder对象都可以完成对文件夹的管理。 管理文件夹的部分属性和方法见书P228表12-3、4 • 1. 文件夹的创建 例:使用FileSystemObject对象的CreateFolder方法在C盘上创建两个文件夹 “apple”和“orange”。 Dim fso Set fso = _ CreateObject("Scripting.FileSystemObject") Fso.CreateFolder("c:\apple") Fso.CreateFolder("c:\orange")

  46. 12.5 文件系统对象模型(FSO) • 2. 文件夹的复制、移动、删除 例: 将上例创建的文件夹orange复制到apple文件夹中 方法一: 使用FileSystemObject对象的方法 Dim fso Set fso = CreateObject("Scripting.FileSystemObject") fso.CopyFolder "c:\orange", "c:\apple\" 方法二: 使用Folder对象的方法 Dim fso, o_folder Set fso = CreateObject("Scripting.FileSystemObject") Set o_folder = fso.GetFolder("c:\orange") o_folder.Copy "c:\apple\"

  47. 12.5 文件系统对象模型(FSO) • 3. 获取与文件夹有关的信息 FileSystemObject对象和Forlder对象配合使用 【例12-7】查看文件夹apple的部分属性。 Private Sub Form_Click() Dim fso, o_folder, s_Str Set fso=CreateObject("Scripting.FileSystemObject") Set o_folder = fso.GetFolder("c:\apple") ' 获得文件夹所在的驱动器 s_Str = "文件夹" & o_folder.Name & "在 " s_Str=s_Str & UCase(o_folder.Drive) & "驱动器上" s_Str = s_Str & vbCrLf & vbCrLf ' 获得文件夹名及创建时间 s_Str = s_Str & "创建时间是:"& _ o_folder.DateCreated MsgBox s_Str End Sub

  48. 12.5 文件系统对象模型(FSO) • 12.5.4 管理文件 功能: 包括文件的创建(打开)、复制、移动、删除及获取与文件 有关的信息。 可以使用FileSystemObject对象和File对象完成文件管理工 作。 管理文件的部分属性和方法:P229-230 表12-5;表12-6 • 1. 文件的创建与打开 FSO对象模型提供了三种创建和打开文件的方法: (1)使用FileSystemObject对象的CreateTextFile方法 格式: <对象名>.CreateTextFile(<文件名>[,<覆盖否>[,Unicode]]) 功能: 创建一个指定文件名的文件,并且返回一个用于对该文件进行读写的TextStream对象。

  49. 12.5 文件系统对象模型(FSO) • 说明: ①<对象名>: 一个FileSystemObject的名字。 ②<文件名>: 字符串表达式,表示新创建的文件名。 ③<覆盖否>: 当设置为False时,表示如果文件已存在,新创建的文件不覆盖原文件,否则覆盖原文件。缺省值为False。 使用前应用FileExists方法判断文件是否存在,以免发生错误。 ④Unicode: 当设置为False时,表示创建ASCII文件,否则创建Unicode文件。缺省值为False。

  50. 12.5 文件系统对象模型(FSO) • 【例12-8】创建一个名为“testfile.txt”的文件,并在文件中写入“创建文件方法一:使用CreateTextFile方法”。 Private Sub Command1_Click() Dim fso, tso Set fso = CreateObject("Scripting.FileSystemObject") ' 判断文件是否存在 If fso.FileExists(“c:\testfile.txt”) Then MsgBox "文件已存在!" Unload Me Else Set tso = fso.CreateTextFile("c:\testfile.txt", True) tso.WriteLine ("创建文件方法一: 使用 CreateTextFile方法") ' 向文件中写 tso.Close End If End Sub

More Related