640 likes | 783 Views
本章要点: • 文件的基本概念 • 顺序文件 • 随机文件 • 文件系统控件 • 文件系统对象模型. 第12章 文 件. 12.1 文件的基本概念. 文件: 是指存储在外部介质上的数据的集合。 分类: 从文件内容分 — 程序文件、数据文件 按存取方式分 — 顺序文件、随机文件、二进制文件 顺序文件: 普通的纯文本文件。 查找数据必须按记录顺序进行。 不能同时进行读写操作。 随机文件: 以固定长度的记录为单位进行存储。
E N D
本章要点: • 文件的基本概念 • 顺序文件 • 随机文件 • 文件系统控件 • 文件系统对象模型 第12章 文 件
12.1 文件的基本概念 • 文件: 是指存储在外部介质上的数据的集合。 • 分类: • 从文件内容分—程序文件、数据文件 • 按存取方式分—顺序文件、随机文件、二进制文件 顺序文件: 普通的纯文本文件。 查找数据必须按记录顺序进行。 不能同时进行读写操作。 随机文件: 以固定长度的记录为单位进行存储。 可以按任意顺序访问其中的数据。 可以同时进行读写操作。 不能用字处理软件查看。 二进制文件: 以字节为单位进行访问。 不能用字处理软件查看。
12.1 顺序文件 顺序文件: ASCII文件 由任何字处理软件建立、在VB中建立 只能按顺序存取记录 例: 文件AA.DAT内容如下: "zhang san","85","90" "li si","70","66" "wang wu","90","89" 记录: 行 域: 字段,数据项 顺序文件操作: 打开文件、读或写文件、关闭文件
12.1 顺序文件 • 12.2.1 顺序文件的打开和关闭 1. 顺序文件的打开 使用之前必须先打开 格式:Open <文件名> FOR <方式> AS[#]<文件号> 功能:按指定的方式打开文件,并指定一文件号。 <方式>: Input—以只读方式打开。当文件不存在时出错。 Output —以写方式打开。 如果文件不存在,则创建一个新文件。 如果文件已经存在,则删除原数据。 Append—以添加方式打开文件。 如果文件不存在,就创建一个新的文件。 如果文件已经存在,写数据时从文件尾开始进行添加。 <文件号> : 1到511之间的整数。
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
12.1 顺序文件 2. 顺序文件的关闭 完成文件操作后,要关闭打开的文件。 格式: Close [<文件号列表>] 其中: <文件号列表>缺省时关闭所有打开的文件。 例: (1) 关闭文件号为1的文件 Close #1 (2) 关闭文件号为1、2、8的文件 Close #1, 2, #8 ' 文件号前的“#”号可以省略 (3) 关闭所有打开的文件 Close
12.1 顺序文件 12.2.2 顺序文件的读写 • 1. 顺序文件的写操作 (1) Write #语句 格式: Write #<文件号>,[<输出列表>] 功能: 将<输出列表>的内容写入指定的文件中。 说明: •<输出列表>中各项之间要用逗号分开 •<输出列表>每一项可以是常量、变量或表达式。 • 写到文件中的各数据间自动插入逗号,字符串自动加上双引号 • 所有数据写完后,在最后加入一个回车换行符。 • 不含<输出列表>的Write #语句,将在文件中写入一空行
Text1 Text2 Text3 Text4 CommonDialog1 Command2 Command1 12.1 顺序文件 【例12-1】建立一个新的学生成绩文件,将输入的学生成绩添加到文件中。界面如下图。
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
12.1 顺序文件 (2) Print #语句 格式: Print #<文件号>,<输出列表> 功能:将<输出列表>的内容写入指定的文件中。 说明: •当<输出列表>用逗号分隔时,采用分区格式输出; •当<输出列表>用分号分隔时,采用紧凑格式输出。 •所有项将在一行内输出,输出后将自动换行。 •可以使用Spc()函数和Tab()函数。 将例12-1中的Write #语句改用Print #语句: Print #2, no, na, g1, g2
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.1 顺序文件 • 2. 顺序文件的读操作 (1) Input #语句 格式: Input #<文件号>,<变量列表> 功能: 从文件中读取数据,并按顺序给变量列表中的变量赋值。 说明: 常用于读取用Write语句生成的文件数据。 按顺序读,每读完一条记录,记录指针向后移动一条记录。
Text1 CommonDialog1 Command1 12.1 顺序文件 • 【例12-2】读入上例生成的文件,并计算每个学生的平均成绩,界面如下,其中,通用对话框控件用于打开一个“打开文件”对话框,在对话框中所选择的文件将作为要显示的文件。
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
12.1 顺序文件 (2) Line Input #语句 格式: Line Input #<文件号>,<变量名> 功能: 从文件中读取一行数据,作为字符串存放在 <变量名>中。 (3) Input函数 格式: <变量名>=Input(整数,[#]<文件号>) 功能: 从指定文件的当前位置一次读取指定个数的字符,并赋值给变量。 (4) InputB函数 格式: <变量名>=InputB(字节数,[#]<文件号>) 功能: 从指定文件的当前位置一次读取指定字节数的数据,并赋值给变量。
Text1 Text2 CommonDialog1 12.1 顺序文件 • EOF函数: 在读顺序文件时,常用EOF函数判断是否已读到了文件尾。格式为: EOF(<文件号>)。 当到达文件的结尾时, EOF函数返回True。否则返回False。 • 【例12-3】读取例12-1生成的学生成绩文件,计算每个学生的平均成绩,计算每门课的平均成绩,将结果显示于文本框中,同时将计算结果与原数据保存于另外一个指定的文件中,设计界面如下图所示。
学号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 顺序文件 分析: 设立三个数组: 学号、姓名、成绩
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
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
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
12.3 随机文件 随机文件特点: 读写次序任意、记录长度相等 随机文件中的记录常定义为用户自定义类型。 • 1. 用户自定义类型 [Private|Public] Type <自定义类型名> <元素名>[(下标)] As <类型> [<元素名>[(下标)] As <类型>] … End Type 说明: (1) <自定义类型名>、<元素名>遵循变量的命名规则。 (2) <类型>可以是VB系统提供的基本数据类型或已声明的自定义类型。
12.1 顺序文件 (3) 缺省[Private|Public]选项时,默认为Public。 必须在窗体模块或标准模块的“通用”位置的声明段进行声明。 在窗体模块中定义时必须使用Private关键字。 (4) 如果自定义类型的一个元素为数组,则其下标的下界不受Option Base语句的限制。 (5) 在使用自定义类型前,必须先声明自定义类型的变量。 (6) 引用自定义类型元素,使用如下格式: <自定义类型变量名>.<元素名>
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 ' 声明一个自定义类型变量
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
12.1 顺序文件 • 12.3.1 随机文件的打开和关闭 • 1. 随机文件的打开 使用之前必须先打开文件 格式: Open <文件名> [For Random] As <文件号> Len = <记录长度> 说明: (1) For Random表示打开随机文件,可以省略。 (2) <记录长度>: 通常就是自定义类型的大小,可用Len函数获得。 (3) 若文件不存在,则建立一个新的文件。 • 2. 随机文件的关闭 Close语句
12.1 顺序文件 • 12.3.2 随机文件的读写 • 1. 写文件 格式: Put [#]<文件号>,[<记录号>],<变量名> 功能: 将一个变量的数据写入随机文件中。 说明: (1) <记录号>: 若文件中已有此记录,则该记录将被新数据覆盖;若文件中无此记录,则在文件中添加一条新记录。 如果省略<记录号>,则写入数据的记录号为上次读或写的记录的记录号加1。 (2) <变量名>: 通常是一个自定义类型的变量,也可以是其他类型的变量。
12.1 顺序文件 • 2. 读文件 格式: Get [#]<文件号>,[<记录号>],<变量名> 功能: 将一个已打开的随机文件读入一个变量之中。 【例12-4】建立学生成绩随机文件。界面如下图。
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
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
12.4 文件系统控件 • 驱动器列表框(DriveListBox) • 目录列表框(DirListBox) • 文件列表框(FileListBox) • 作用: 获取有关驱动器、目录和文件的当前状态
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
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
12.4 文件系统控件 • 12.4.3 文件列表框(FileListBox) 显示特定目录下的文件。 • 1. 属性 (1) Path 设置或返回当前工作目录的完整路径。 (2) FileName 设置或返回所选文件的路径和文件名。 设置时: 文件名可以带路径 返回时: 文件名不含路径名 (3) Pattern:设置对显示文件的过滤。 例: Filelistbox1.Pattern= "*.EXE ; *.COM " 只显示以 .EXE和 .COM为后缀的文件 • 2. 事件 Click 和DblClick事件
Drive2 Drive1 Dir1 Dir2 File1 File2 12.4 文件系统控件 • 【例12-5】使用以下界面进行文件的复制和删除。
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
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
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
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
12.5 文件系统对象模型(FSO) 通过对象提供的属性和方法来操纵和管理文件系统。 • 12.5.1 文件系统对象模型概述 • 1. FSO对象模型的主要对象 (1) FileSystemObject—核心对象。提供了一整套用于创建、删除、收集相关信息,以及通常的操作驱动器、文件夹和文件的方法。 (2) Drive—用来收集系统所用的驱动器的信息。 (3) Folder—提供对一个文件夹所有属性的访问(查询文件夹的名称、路径等)。也允许使用适当的方法创建、删除或移动文件夹。 (4) File—提供对文件所有属性的访问(查询文件的名称、路径等),也可以使用适当的方法创建、删除或移动文件。 (5) TextStream—允许用户读和写文本文件。
12.5 文件系统对象模型(FSO) • 2. 使用FSO对象模型编程的主要步骤 (1) 创建FileSystemObject对象。 (2) 根据编程需要,有两种选择: •对FileSystemObject对象使用适当的方法生成用于管理驱动器、文件夹和文件的对象(如Drive对象、Folder对象、File对象);用新创建的对象进行文件和文件夹的复制、移动、删除。 •使用FileSystemObject对象的方法,进行文件或文件夹的创建、复制、移动、删除。再生成用于管理驱动器、文件夹和文件的对象(如Drive对象、Folder对象、File对象)来实现其他功能。 (3) 访问步骤2生成的新对象的属性,来获取文件系统的信息(如文件名称、大小等)。
12.5 文件系统对象模型(FSO) • 3. FileSystemObject对象的创建 创建FileSystemObject对象主要有二种方法: (1) 使用New关键字,将一个变量声明为 FileSystemObject对象类型。 例: Dim fso As New FileSystemObject (2) 使用CreateObject函数创建一个FileSystemObject对象。 例: Set fso = CreateObject("Scripting.FileSystemObject")
12.5 文件系统对象模型(FSO) • 3. 说明 (1) FSO对象目前不支持对二进制文件和随机文件的访问,只能通过TextStream对象读写纯文本文件。 (2) FileSystemObject对象提供了许多与其他对象相同的功能,如FileSystemObject对象的CopyFile方法与File对象的Copy方法功能一样。编程时可以任选一种方法使用。
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:")
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
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")
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\"
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
12.5 文件系统对象模型(FSO) • 12.5.4 管理文件 功能: 包括文件的创建(打开)、复制、移动、删除及获取与文件 有关的信息。 可以使用FileSystemObject对象和File对象完成文件管理工 作。 管理文件的部分属性和方法:P229-230 表12-5;表12-6 • 1. 文件的创建与打开 FSO对象模型提供了三种创建和打开文件的方法: (1)使用FileSystemObject对象的CreateTextFile方法 格式: <对象名>.CreateTextFile(<文件名>[,<覆盖否>[,Unicode]]) 功能: 创建一个指定文件名的文件,并且返回一个用于对该文件进行读写的TextStream对象。
12.5 文件系统对象模型(FSO) • 说明: ①<对象名>: 一个FileSystemObject的名字。 ②<文件名>: 字符串表达式,表示新创建的文件名。 ③<覆盖否>: 当设置为False时,表示如果文件已存在,新创建的文件不覆盖原文件,否则覆盖原文件。缺省值为False。 使用前应用FileExists方法判断文件是否存在,以免发生错误。 ④Unicode: 当设置为False时,表示创建ASCII文件,否则创建Unicode文件。缺省值为False。
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