《Delphi软件开发技术 教学课件 ppt 作者 张世明P8》由会员分享,可在线阅读,更多相关《Delphi软件开发技术 教学课件 ppt 作者 张世明P8(97页珍藏版)》请在金锄头文库上搜索。
1、第8章 文件操作,Delphi对文件的支持,主要有三类,包括Object Pascal语言对文件的支持、可视组件库(VCL)对文件的支持以及数据库对文件的支持。,8.1 文件操作命令 8.2 文本文件 8.3 非文本文件 8.4 文件系统 8.5 文件流,8.1 文件操作命令,首先,我们先介绍文件类型、文件定义这些有关文件的基础常识,然后再介绍常用的文件操作命令。,8.1.1 文件的类型,一个文件是同种类型的元素的有序集合,要声明一个文件类型,使用语句: type =File of ;,其中:是一个有效的自定义文件类型名,是某种类型。,由于文件指针不允许含糊,必须明确指定,所以在文件中不能包含
2、动态数组、长字符串、类、对象、指针、变量、构造类型以及其他文件。,8.1.2 文件的定义,在Object Pascal语言中,有两种文件类型,TextFile和File。,TextFile是包含文字的文本文件,File是指记录长度固定的二进制数据文件。,要定义一个文本文件,可以使用以下格式:,var TxtFile:TextFile;,要定义一个二进制数据文件,需用到关键字File of再加上数据类型,格式如下:,var :File of ;,也可以只有关键字File,而没有of和后面的数据类型,此时它表示的是一种无类型文件,允许读写可变长度记录的文件。,有类型的File文件与数组Array、
3、记录Record相似,也是长度固定的数据集合。,8.1.3 文件管理命令,文件管理函数,8.1.4 文本文件命令,文本文件命令,8.1.5 输入输出命令,输入输出命令,8.2 文本文件,在Object Pascal中,文本文件由行组成,而行又由字符组成,每行以行尾标记结束,它是顺序性的。,也就是说,在这类文件中,可以定位到后面的某一行,但如果要回到前面的某行,就必须再重头读起;,写文件时,也不能在文件中插入任何信息,要么覆盖原文件,要么加到文件的结尾。,另外,文件可以读或者写,但不能同时读写。,要定义一个文本文件,可以使用如下语句: var :TextFile;,8.2.1 打开文本文件,打开
4、文件先需要调用AssignFile函数,它可以把文件变量与物理文件关联起来,例如: AssignFile(TheTxtFile,Example.Txt); 有三种方法:,就把自定义的文件变量TheTxtFile与文件Example.Txt关联起来,要指出的是,如果关联的文件不在当前目录下,应给出它的完整路径。,然后,就可以打开文件了,打开文件可。,(1). Reset方法,它以读的方式打开文本文件并将文件指针移到文件首,使第一次读操作访问的是文件中的第一行,格式如:,Reset(TheTxtFile); 如果用这个方法去打开一个不存在的文件,程序会产生运行错误。,(2). Rewrite方法,
5、它以写的方式创建一个新文件,并将文件指针定位在文件首,使第一次写入的数据出现在文件首部,格式如:,Rewrite(TheTxtFile); 如果用这个方法去打开一个已经存在的文本文件,原数据会全部丢失。,(3). Append方法,它以写的方式打开一个已经存在的文件,并把文件的指针定位在文件尾部,这样可以避免丢失原有数据。,如果用这个方法去打开一个不存在的文件,程序会产生运行错误。,8.2.2 关闭文本文件,当对文本文件操作完成以后,必须关闭文件,以防止文件系统被破坏,关闭文件可以使用CloseFile函数,格式如:,CloseFile(TheTxtFile); 使用这个函数一般会清除文件缓冲
6、区并让系统更新文件分配表。,8.2.3 写入文本文件,在文本文件命令中我们已经认识到,写入文本文件有两种方式Write和WriteLn,它们的区别是WriteLn在写完数据后加上行结束标记,因此,它也比较常用。 下面来看一个例子:,var TheTxtFile:TextFile begin AssignFile(TheTxtFile,Example.dat); Rewrite(TheTxtFile); WriteLn(TheTxtFile,美丽人生); CloseFile(TheTxtFile); End;,在程序中,先声明了一个文本文件变量,将它与要创建的文件Example.dat关联后,用
7、Rewrite语句创建一个文件并将文件指针指向文件首,,使用WriteLn语句写入字符串“美丽人生”到文件中,并在行末加上回车换行标记,最后关闭文件。,如果用Write函数加入数据,则在信息的末尾无换行及回车符。,两种写入操作方法,都可以在写入的参数后加上冒号“:”和一个域宽值,来指定数据输出时的宽度,例如,可以使用以下代码:,Writeln(TheTxtFile,A:8,B:8,C:8); 则输出结果为 A B C,如果要将字符串列表(StringList)直接写入文件,可以使用TStrings对象的SaveToFile函数,格式为: StringName.SaveToFile(FileNa
8、me);,8.2.4 读取文本文件,要逐项从文本文件中读取信息,首先用Reset函数以读的方式打开文件,然后可以用Read或ReadLn函数从文件中读取数据,下面仍通过举例来说明:,var ReadFile:TestFile; S:string100; Begin,AssignFile(ReadFile,Example.dat); Reset(ReadFile); ReadLn(ReadFile,s); CloseFile(ReadFile); End;,程序中先将文本文件变量ReadFile和文件Example.dat关联起来,以读方式打开,用ReadLn读出一定数量的字符,直到遇到回车或换
9、行符,,并将文件指针移到文本文件下一行的开头,如果读取的字符数多于字符串变量长度(我们定义为100)时,多余的字符被忽略。,而在程序中如果用Read方法读取文件时,它将读取定义的字符串长度,并将文件指针停留在读取字符的结束位置处,而不会移到下一行首。,如果读取的是一个字符串列表则用下列语句就可以了: StringListName.LoadFromFile(FileName);,Delphi提供了一个判断是否到达文件末尾的函数EOF,语法格式为: Function EOF(var TextFileID:TextFile):Boolean;,如果读取已经到达文件的结尾处,函数返回True;否则为F
10、alse。因此在下个例子中我们可以读取文件Example.dat中的所有信息:,var ReadFile:TextFile; s:string; begin AssignFile(ReadFile,Example.dat); Reset(ReadFile); While not EOF(ReadFile) do Begin,ReadLn(ReadFile,s); ShowMessage(s); End; CloseFile(ReadFile); end; 本程序将文件内容一行行地显示在信息框中。,8.3 非文本文件,用关键字File来定义,含有特定数据类型的叫做类型文件,不含数据类型的叫做无类
11、型文件。,8.3.1 类型文件,类型文件的定义方式如下: var : File of 类型文件的数据类型可以是整数、实数或用户自己定义的记录类型,由于类型文件的结构由定义它的数据类型所确定,不必进行类型转换,因此读写比较快捷。,与文本文件相似,类型文件的关联使用AssignFile函数,打开文件可以使用Reset和Rewrite函数,但不能使用Append函数;类型文件的读采用Read函数、写采用Write函数,读写操作都先需要有文件变量,关闭类型文件用CloseFile函数。,8.3.2 无类型文件,无类型文件的定义中不含数据类型,所以它可以不受数据类型的限制,也不必有一致的结构。 无类型文
12、件的关联和打开函数与类型文件完全相同,但参数不同,无类型文件的打开函数Reset和Rewrite中有第二个参数,用来指明记录的大小,另外无类型文件的读写使用的函数也不同,它使用BlockRead函数来读,BlockWrite函数来写,它们的参数是一样的,例如:,BlockRead(a,b,c,d); BlockWrite(a,b,c,d); 函数的参数中,a表示要访问的文件变量;b表示数据结构名;c表示要读取记录的个数;d返回实际读出或写入记录的个数。,无类型文件也可以使用Seek、FileSize和FilePos函数,分别用来指针定位,求出文件含记录个数以及求出当前文件指针位置。,8.4 文
13、件系统,在文件操作中,除了文件类型,Delphi还提供了一些文件操作以及用于文件操作的组件。下面开始介绍文件系统组件的使用。,8.4.1 文件系统组件,组件板的Win31选项卡上有4种文件系统组件,分别是: (1). DirectoryListBox组件:用来列出指定驱动器的树型目录结构,(2). FileListBox组件:用来列出指定目录下满足一定扩展名条件的所有文件,(3). DriveComboBox:选择框,用来从系统中己安装的逻辑驱动器中选择一个作为当前驱动器,(4). FilterComboBox:文件筛选框,用来指定文件的扩展名,8.4.2 文件控制单元,除了上面介绍的4个文件
14、系统组件外,Delphi还提供了一个FileCtrl(文件控制)单元,它有三个重要的函数用来管理文件:,1). DirectoryExists函数:检验文件目录是否存在。 (2). ForceDirectories函数:创建文件目录。 (3). SelectDirectory函数:从对话框中选择预定义的目录。,用户在安装软件时,经常会遇到要求选择软件安装的目录的问题,利用上述三个函数很容易就能达到达个目的。,8.5 文件流,在可视组件库(VCL)中,Delphi定义了一个TStream类和它的三个子类TFileStream、THandleStream、TMemoryStream,它们提供了一些
15、方法使得用户可以对流进行存储和读取。,其中,THandleStream用于具有Windows句柄的文件;TFileStream则用于已了解文件名的文件;TMemoryStream一般用于管理内存地址,与实际文件无关。,8.5.1 文件流命令,Delphi提供了许多文件流命令,下面我们介绍其中比较重要的几个:,(1). 文件流的读使用Read函数,语法格式为: function Read(var Buffer;Count:LongInt):LongInt; Read函数从文件流中读取指定数目的字节到缓冲区中,并将文件流指针移到指定字节数的位置。,(2). 文件流的写使用Write函数,语法格式为
16、: function Write(const Buffer;Count:LongInt):LongInt; Write函数从缓冲区中写指定数目的字节到文件流中,文件流指针后移到相应位置。,(3). 读和写文件流操作返回的实际上是字节数,执行相应操作的还有两个过程: procedure ReadBuffer(var Buffer;count:LongInt); procedure WriteBuffer(const Buffer;count:LongInt);,(4). 而文件流对组件的读写分别使用下面两个函数: function ReadComponent(instance:TComponent):TComponent;,function WriteComponent(instance:TComponent):TComponent; 这两个函数分别在文件流中读取或写入由实例instanc