320 likes | 467 Views
单元辅导(八). 文件处理. [ 学习目标 ] 掌握:文件控件和文件操作。 理解:文件类型及结构。 [ 学习要点 ] 利用文件控件处理文件的方法、文件处理函数、文件系统对象( FileSystemObject )编程。 在计算机系统中,文件是指存放在外部存储介质上的数据和程序等。为了方便用户存取,在现代的计算机系统中,都包含有文件管理系统,用户可以对文件进行各种各样的处理和操作,如选择、打开和删除等。. 文件控件:
E N D
单元辅导(八) 文件处理
[学习目标] 掌握:文件控件和文件操作。 理解:文件类型及结构。 • [学习要点] 利用文件控件处理文件的方法、文件处理函数、文件系统对象(FileSystemObject)编程。 在计算机系统中,文件是指存放在外部存储介质上的数据和程序等。为了方便用户存取,在现代的计算机系统中,都包含有文件管理系统,用户可以对文件进行各种各样的处理和操作,如选择、打开和删除等。
文件控件: 一、DriveListBox控件:在程序的运行过程中,为用户提供一个选择有效的磁盘驱动器的功能,该控件可以用来显示用户系统中所有有效磁盘驱动器的列表。Drive属性,可以在程序的运行阶段通过设置Drive属性的值来改变DriveListBox控件的缺省驱动器。 例: 1、添加控件如图;设置属性:ToolTipText:DriveListBox控件的应用 2、添加代码: Private Sub Form_Load() Drive1.Drive = "e:\" End Sub
3、运行程序: 演 示 实 验 二、DirListBox控件:在程序的运行过程中,显示分层的 目录列表。 重要属性 Path属性:用于返回或设置当前路径,属性的值是一个指示路径 的字符串。 例:1、添加DirListBox控件和DriveListBox控件 2、添加代码: Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Form_Load() Drive1.Enabled = True Dir1.Enabled = True Drive1.Drive = "e:\" End Sub
3、运行程序: 演 示 实 验 List属性:返回或设置控件的列表部分的工程。 语法:object.List(index)[=string] 说明:Object:对象表达式 Index:列表中具体某一工程的号码 String:字符串表达式 例:1、界面设计:放置一个DriveListBox控件和一个DirListBox控件。
2、添加代码: Private Sub Dir1_Change() MsgBox Dir1.List(-2) End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Form_Load() Drive1.Enabled = True Dir1.Enabled = True Drive1.Drive = "e:\" End Sub 3、运行程序: 演 示 实 验
ListCount属性:返回控件的列表部分工程的个数,对DirListBox 控件而言,ListCount属性中存储着当前目录中子目录的个数。 例:1、添加代码:Private Sub Dir1_Change() MsgBox Dir1.ListCount End Sub 2、运行结果: 演 示实 验
三、FileListBox控件:在程序的运行过程中,根据Path属性三、FileListBox控件:在程序的运行过程中,根据Path属性 指定的目录,将文件定位并列举出来。 例:1、界面设计:设置属性:Patteren:*.txt;*.exe 2、添加代码: Private Sub Form_Load() File1.Path = "c:\windows\" End Sub Private Sub File1_Click() Text1.Text = "文件路径:" & File1.Path & "\" & File1.FileName End Sub
3、运行程序: 演 示实 验
例:1、添加控件,设置属性 • 利用文件控件来处理文件 • 第一个示例:综合利用DriveListBox控件、DirListBox控件和 FileListBox控件的协调工作来处理文件。 2、添加代码: Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub
Private Sub File1_Click() MsgBox File1.Path & "\" & File1.FileName End Sub Private Sub Form_Load() Drive1.Enabled = True Dir1.Enabled = True File1.Enabled = True File1.Pattern = "*.exe" Drive1.Drive = "c:\" End Sub 3、运行程序: 演 示 实 验
第二个示例: 1、添加控件,设置属性 2、添加代码: Private Sub Command1_Click() End End Sub Private Sub Command2_Click() CommonDialog1.ShowOpen Image1.Picture = LoadPicture(CommonDialog1.FileName) End Sub Private Sub Command3_Click() Image1.Picture = LoadPicture("") End Sub Private Sub Form_Load() Command1.Enabled = True Command2.Enabled = True Command3.Enabled = True End Sub
3、运行程序: 演 示 实 验 • 文件处理函数 Kill 语句:从磁盘中删除文件,它的语法结构如下:Kill pathname 其中参数pathname是用来指定一个文件名的字符串表达式, pathname要包含文件所在的目录或文件夹以及驱动器。Kill支持多 字符(*)和单字符(?)的统配来指定多重文件。FileCopy 语句:复制一个文件 ,它的语法结构如下FileCopy source,destination 在FileCopy语句的语法中包括两个参数,其中soure用来表示要 被复制的源文件名,而 destination 用来指定要复制的目的文件名在 Source 和 destination 参数中都要包含文件所在的目录或文件夹以及 驱动器。
Shell 函数 :执行一个可执行文件,同时返回一个Variant(Double),如果 成功的话,代表这个程序的任务ID,若不成功,则会返回0. 它的语法结构如下:Shell(pathname[,windowstyle])参数说明:pathname为所要执行的应用程序的名称及其路径和必要 的参数;windowstyle表示在程序运行时窗口的样式。其中的参数 windowstyle的设置及其说明如表设置值说明: 0 窗口被隐藏,且焦点会移到隐藏式窗口; 1窗口具有焦点,且会还原到它原来的大小和位置;2窗口会以一个具有焦点的图标来显示;3窗口是一个具有焦点的最大化窗口;4 窗口会被还原到最近使用的大小和位置,而当前活动的窗口 仍然保持活动; 6窗口会以一个图标来显示,而当前活动的窗口仍然保持活动。 RmDir 语句:删除一个存在的而且为空的目录或文件夹,它的语法 结构如下所示:Rmdir path 其中参数Path是一个字符串表达式,用来指定要删除的目录或文件 夹。如果在参数 Path 中没有指定驱动器 ,则 Rmdir 会在当前驱动器上 删除为空的目录或文件夹。
Name语句:重新命名一个文件、目录或文件夹,它的语法结构如下: Name oldpathname As newpathname 其中包括以下两个部分:oldpathname为字符串表达式,由它来指定已存在的文件名和位置, 在其中包含目录或文件夹以及驱动器。newpathname也是字符串表达,它指定新的文件名和位置,同样要 包含目录或文件夹以及驱动器。 • 文件系统 在计算机中,文件随着分类方法的不同名也各不一致。 按照文件的存取方式及其组成结构可以分为两种类型: 顺序文件、随机文件;按照文件的数据编码方式来分可以分为 ASCII码文件和二进制文件; 按照文件的特征属性来分可以分为 系统文件、隐藏文件、只读文件、普通文件和存档文件;按照文件的数据性质来分可以分为 程序文件和数据文件。
文件的访问语句和函数: 一、顺序文件顺序的访问是为普通的文本文件的使用而设计的。文件中每一个 字符都被假设为代表一个文本字符或者文本格式序列。数据被存储为 ASCII字符。而为随机型访问打开的文件则认为是由相同长度的记录 集合组成。可用记录类型来创建由各种各样的字段组成的记录,每个 字段可以有不同的数据类型。数据作为二进制信息存储。二进制访问 允许使用文件来存储所希望的数据。除了没有数据类型或者记录长度 的含义外,它与随机访问很相似。
所谓的顺序文件,通常指的是普通的文本文件,文件中的字符所谓的顺序文件,通常指的是普通的文本文件,文件中的字符 包括文本字符及控制字符,如“,”,“chr(14)”,“cr,lf” ,“chr(10)等。 由于这类型文件的信息是按照顺序从头到尾按顺序排列,而且 只提供第一条记录的存储位置,所以对其中的数据信息进行处理是 相当困难的。 【顺序文件的打开】打开顺序文件的语法结构如下:Open pathname For mode [Access access] [lock] as [#] filenumber [Len=reclength] Open语句的语法参数及其说明: Pathname:指定文件路径和文件名 Mode:指定文件方式,有Append,Binary,Input,Output或 Random方式 Access:说明打开的文件 可以进行的操作,有Read,Write或 ReadWrite操作 Lock:说明其它进程能够打开的文件进行的操作Shared,Lock, Read,LockWrite和LockReadWrite操作 Filenumber:一个有效的文件号,范围在1到511之间 Reclength:小于或等于32767(字节)的一个数,对于用随机访问 方式打开的文件,该值就是记录长度,对于顺序文件, 该值就是缓冲字符数 。
【顺序文件的读操作】 从顺序文件中的读取数据的语法结构:Input # filenumber,varlist Input # 语句的语法参数及说明如下:filenumber:有效的文件号varlist:用逗号分界的变量列表,将文件中读出的值分配给这些变量。【利用Write#语句执行写操作】 向顺序文件中写入数据的语法结构:Write # filenumber,[outputlist] Write # 语句的语法具有以下几个部分,它的参数及说明如下:filenumber: 一个有效的文件号outputlist: 要写入文件的表达式,用逗号将这些表达式分界 【利用Print#语句执行写操作】Print#语句的功能是把格式化显示的数据写入顺序文件中,它的 语法结构:Print #filenumber,[output]
其中参数包括以下两个部分:Filenumber:一个有效的文件号 Outputlist:要写入文件的表达式,用逗号将这些表达式分界 其中参数outputlist的设置如下:[{|Spc(n)|tab[(n)]}][expression][charpos] Spc(n):输出数据中插入空白字符,数字n表示要插入的空白字符个数 tab(n):用来将插入点定位在某一绝对列号上,n是列号 expression:要打印的数值表达式或字符串表达式 charpos: 指定一个字符的插入点 二、随机文件随机文件由记录组成,能够随机存取其机同长度的数据记录, 每一数据记录内可以设计各种栏位以容纳不同的数据。此种文件数 据是以二进制的位的形式保存存在磁盘上。【变量声明 】 在应用程序打开随机文件以前,应用声明所有用来处理该文件 数据所需的变量,包括用户定交类型的变量,它对应着该文件中的 记录和标准类型的其它变量,这些变量保存随机文件相关的数据。 在打开一个文件进行随机访问之前,应定交一个类型,该类型对应 于该文件包含或将包含的记录。
因为随机文件中的所有记录都必须有相同的长度,所以可在类型 因为随机文件中的所有记录都必须有相同的长度,所以可在类型 定义中声明字段变量。固定的长度对用户定交类型中的各字符串元素 通常很有用。【打开随机文件】要打开随机文件,使用以下语法的Open语句Open pathname [For Random] As filenumber Len=reclength 因为Random是缺省的访问类型,所以For Random 关键字是可选 项。表达式Len=reclength指定了每个记录的字符数。如果reclength比 实际长度短,则会产生一个错误。如果reclength比实际长度和,则可 写入,但是会浪费磁盘空间。 【编辑随机文件】 如要编辑随机文件,先把记录从文件读到程序变量,然后改变 各变量的值,最后,把变量写回该文件。使用 Get 语句把记录复制 到变量。使用 Put语句把记录添加或者替换到随机文件。使用Put语 句,指定要替换的记录位置。 要向随机文件的尾端添加新记录,可使用Put语句。把 Position 变量的值设置为文件中的记录数增1。 例:要在一个包含五个记录的文件中的添加一个记录,把 Position 设置为6.下述语句把一个记录添加到文件的末尾;lastRecord=LastRecord+Put #Filenum,LastRecord,Employee通过清除其字段可删除一个记录,但是该记录仍在文件中存在。 最好把余下的记录拷贝到一个新文件,然后删除旧文件。
要清除随机文件中删除的记录,按照以下步骤执行:S1:创建一个新文件。S2:把所有有用的记录从原文件复制到新文件S3:关闭原文件并用Kill语句删除它。S4:使用Name语句把新文件以原文件的名字重新命名三、二进制文件 二进制文件与随机文件类似,惟一不同是:不必限制于固定长度,要清除随机文件中删除的记录,按照以下步骤执行:S1:创建一个新文件。S2:把所有有用的记录从原文件复制到新文件S3:关闭原文件并用Kill语句删除它。S4:使用Name语句把新文件以原文件的名字重新命名三、二进制文件 二进制文件与随机文件类似,惟一不同是:不必限制于固定长度, 可以用喜欢的方式来存取文件。 二进制访问能提供对文件的完全控制,因为文件中的字节可以 代表任何东西。例如,通过创建长度可变的记录可保存磁盘空间。 当要保存文件的尺寸尽量小时,应使用二进制型访问。 要打开二进制的文件,应使用以下open语句的语法:open pathname for binary as filenumber 通过使用二进制型访问可使磁盘空间的使用降到最小。因为二 进制文件不需要固定长度的字段,类型声明语句可以省略字符串长度 参数。例如可以为children类型添加一个字段description来记录幼儿的 一些其他信息: type children name as string *8 age as integer code as string *6 description as string end type
因为description字段中内容的长度是不固定的,而且往往相差很多, 因为description字段中内容的长度是不固定的,而且往往相差很多, 有的可能没有,而有的可能会很长,如果使用固定长度的string类型势 必会造成设置字符串长度的矛盾--太长会浪费磁盘空间,而太短又无法 容纳某些长长的文字。而在二进制文件中每个记录只占用所需字节, 所以不必为字段指定长度。当记录中的字段需要包含大段文字时, 使用二进制文件可以节省大量的磁盘空间。 二进制文件的读写使用与读写随机文件相同的语句:{get|put} [#]filenumber,position,varname 其中varname参数可以是任何类型的变量,包括可变长度的字符 串以及用户自定义的类型。而position参数则指明get 或put语句要处 理的位置。 二进制存取方式由于可以使用长度可变字段,所以不能随机地 访问记录--必须顺序地访问记录以了解每个记录的长度,这是进行 二进制输入/输出的主要缺点。但是在这种文件模式下,可以直接查 看文件中指定的字节,所以二进制模式也是唯一支持用户到文件的 任何位置读写任意长度数据的方法。 为了可以同时使用随机文件和二进制文件的优点,可以使用这样 的组合--当字段的长度固定或者长度变化不大时,可以将这些字段存 储在随机文件中,而对于长度变化很大的字段,可以保存在二进制文 件中,而在随机文件的记录中设置一个字段指定它在二进制文件中的位 置即可。这样,既可以利用随机文件的方便快捷,又可以大大节省许多 磁盘空间。
FSO对象模型编程包括三项主要任务:1、使用CreateObject方法,或将一个变量声明为FileSystemObjectFSO对象模型编程包括三项主要任务:1、使用CreateObject方法,或将一个变量声明为FileSystemObject 对象类型来创建一个FileSystemObject对象。2、对新创建的对象使用适当的方法。3、访问该对象的属性。 FSO对象模型包含在一个称为Scripting的类型库中,此类型库位于 Scrrun.DII文件中。如果还没有引用此文件,从[属性]菜单的[引用]对 话框选择“Microsoft Scripting Runtime ”项。然后就可以使用“对象浏 览器“来查看其对象、集合、属性、方法、事件以及它的常数。 【创建FileSystemObject对象】1、创建 一个FileSystemObject对象:可以通过如下两种方法完成 (1)将一个变量声明FileSystemObject对象类型 Dim fso as new FileSystemObject(2)使用CreatObject方法来创建一个FileSystemObject对象对象类型 Set ofs =creatobject(Scripting FileSystemObject) Scripting 是类型库的名称,而FileSystemObject则是要创建一个实例的 对象的名字。第一种方法中在VB中有效,而第二种方法在VB或VBscrip 中都可行的。 • 文件系统对象编程
2、使用该FileSystemObject对象的适当方法 如果要创建一个新对象,既可以使用CreatFolder方法也可以使用 CreateTextFile方法(FSO对象模型不支持创建或删除驱动器)。如果 要删除对象,可以使用FileSystemObject对象的DeleteFile和DeleteFolder 方法,或者File和Folder对象的Delete方法。使用适当的方法,还可 以复制、移动文件和文件夹。FileSystemObject对象模型中有一些功 能是冗余的。例如,要复制一个文件,既可以使用FileSystemObject 对象的CopyFile方法。 【访问已有的驱动器、文件和文件夹】 要访问一个已有的驱动器、文件或文件夹,可以使用FileSystem_ Object对象中相应的get方法:GetDrive,GetFolder,GetFile.例如:Dim fso As New FileSystemObject,fil as file set fil=fso.getfile("c:\test.txt") 并不需要对新创建的对象使用get方法,因为cteate函数已经返回 了一个句柄到新创建的对象。例如,如果使用CreateFolder 方法创建 了一个新的文件夹,就没有必要使用getfolder方法来访问该对象的名 称、路径、大小等属性。只要给createfolder函数设置一个变量来获取 新建文件夹的句柄,然后就可以访问其属性、方法和事件:
Private Sub Create_Folder()Dim fso as new filesystemobject,fldr as folder Set fldr =fso.createfolder(“c:\mytest”) Msgbox“created folder:” & fldr.Name End Sub 访问对象的属性一旦有了对象的句柄,就能够访问其属性。 例如,假定要获得一个特定文件 夹的名称。首先要创建该对象的一个 实例,然后通过适当的方法得到其句柄:set fldr =fso.getfolder(“c:\”)现 在有了一个folder对象的句柄,可以查看其name属性:Debug.Print“Folder name is :”fldr.name如果要找出一个文件 的最新修改时间,可以使用如下的语法:Dim fso as new filesystemobject,fil as file Set fil=fso.getfile(“C:\detlog.txt”) ‘获得要查询的file 对象。Debug.Print“File last modified:”;fil.DateLastModified ’打印信息 【使用驱动器】 如同在windows资源管理器中能进行的交互方式一样,可以在 程序中使用FSO对象模型来处理驱动器和文件夹,可以复制和移动 文件夹,获得驱动器和文件夹的信息,等等。
Drive对象允许获得系统的各个驱动器的信息,这些驱动器可以是Drive对象允许获得系统的各个驱动器的信息,这些驱动器可以是 物理的,也可以是位于网络上的,通过该对象的属性可以获得下列信 息: 以字节表示的驱动器总间和以字节表示的驱动器可用空间 (AvailableSpacea或FreeSpace属性)为驱动器指定的字母号和驱动器类型,诸如可移动的、固定的、 网络。CD_ROM、或者RAM盘(DriveType属性)驱动器序列号(SerialNumber属性)驱动器使用的文件系统类型,诸如FAT,FAT32,NTFS等等(File_ System属性) 驱动器是否可用(IsReady属性)共享和或卷标的名称(ShareaName和VolumeName属性) 驱动器的路径或根文件 夹(Path和RootFolder属性) 【使用文件夹】任务方法: 创建一个文件夹 FileSystemObject.CreateFolder 删除一个文件夹 Folder.Delete或FileSystemObject.DeleteFolder
移动一个文件夹 Folder.move或FileSystemObject.MoveFolder 复制一个文件夹 Folder.Copy或FileSystemObject.CopyFolder 检索文件夹的名称 Folder.Name 查找一个文件夹是否在驱动器上 FileSystemObject.FolderExists 获得已有Folder对象的一个实例 FileSystemObject.GetFolder 找出一个文件夹的父文件夹的名称 FileSystemObject.GetParentFolderName 找出系统文件夹的路径 FileSystemObject.GetSpacialFolder 【使用文件】 通过使用新的面向对象的FSO对象,如Copy,Delete,Move以及 OpenAsTextStream,或者使用传统的函数,如Open,Close,FileCopy, GetAttr等等,可以使用VB中的文件。注意,不用考虑其文件类型就 可以移动、复制或删除文件。文件操作主要有两类:创建、添加或移动数据,以及阅读文件 移动、复制和删除文件
用FileSystemObject创建文件并添加数据 有二种不同方法来创建一个顺序文本文件 一种方法就是使用CreateTextFile方法。 要创建一个空文本文件: • Dim fso As New FileSystemObject,fil As File • Set fil=fso.CreateTextFile(“c:\testfile.txt”,True)另一种方法是使用FileSystemObject对象的OpenTextFile方法, • 该对象的ForWriting标志设置为:Dim fso As New FileSystemObject,ts As New TextStream Set ts=fso.OpenTextFile(“c:\test.txt”,ForWriting) 或者使用带ForWriting标志设置的OpenAsTextStream Dim fso As New FileSystemObject,ts As New TextStream Set fso=CreamObject(“Scipting.FileSystemObject”) fso.CreateTextFile(“test1.txt”) Set fil=fso.GetFile(“test1.txt”) Set ts=fil.OpenAsTextStream(ForWriting)添加数据到文件文本 文件一经创建,就可以分三步向其中加入数据:(1)打开 • 文本文件以备写入数据。(2)写入数据。(3)关闭文件。
要打开文件,可以使用下面两种方法中的任一种:File对象的 要打开文件,可以使用下面两种方法中的任一种:File对象的 OpenAsTextStream方法,或FileSystemObject对象的OpenTextFile方法。 要向打开的文本文件中写入数据,可以使用TextStream对象的Write或 WriteLine方法。它们之间的惟一差别是WriteLine在指定的字符串末 尾添加换行符。如果在向文本文件中加一个空行,使用WriteBland_ Lines方法。要关闭一个已打开的文件,使用TextStream对象的Close 方法。 2.使用FileSystemObject 读取文件 要从一个文本文件中读取数据,可使用TextStream对象的Read, ReadLine或ReadAll 方法:从一个文件中读取文件中读取指定数量 的字符用Read,读取一整行用ReadLine,读取一个文本文件的所有内 容用ReadAll。如果使用Read或ReadLine方法并且要跳过数据的某些 部分,可以使用Skip或SkipLine方法。这些读取方法产生的文本被存 储在一个字符串中,而这个字符串可以在一个控件中显示,也可以被 字符串操作符分解、合并等等。 3.移动、复制和删除文件 对文件的移动、复制和删除,FSO对象模型都 提供了两种方法,
如表所示 例题:【工程】---【引用】----Micsoft Scripting Runtime module1: Option Explicit Sub manip_files() Dim fso As New filesystemobject, txtfile, fil1, fil2 Set txtfile = fso.CreateTextFile("e:\testfile.txt", True) MsgBox "写入文件" txtfile.write ("这是一个测试例子") txtfile.Close MsgBox "移动文件到e:\tmp" Set fil1 = fso.getfile("e:\testfile.txt") fil1.Move ("e:\tmp\testfile.txt") fil1.Copy ("e:\temp\testfile.txt") MsgBox "删除文件"
Set fil1 = fso.getfile("e:\tmp\testfile.txt") Set fil2 = fso.getfile("e:\temp\testfile.txt") fil1.Delete fil2.Delete MsgBox "全部完成!" End Sub Form1: Option Explicit Private Sub Command1_Click() Call manip_files End Sub
小 结 本单元介绍了Windows操作系统中文件及管理的基本概念,并且 能够通过基本的文件处理函数来对文件进行一简单的处理。 在VB6.0中为了方便用户对方开发,提供了几种文件控件,如 DriveListBox控件、DirListBox控件、FileListBox控件和CommDialog 控件,它们可以实现相应不同的功能,只要协调好这几个控件的关 系,就可以实现初步的文件处理。