Delphi 6集成开发环境06

  • 格式:pdf
  • 大小:315.46 KB
  • 文档页数:18

第6章 文件管理

程序设计当中,我们时常会遇到需要处理文件、目录及驱动器的情况。通常,文件、目

录和驱动器的管理是由操作系统来完成的。但是,对文件、目录和驱动器的一些具体操作却

要通过编程来实现。在Delphi集成开发环境中,编程可以方便地实现对文件、目录和驱动器

的操作。

在界面方面,Delphi提供了一些标准的文件对话框。对于具体的文件、目录和驱动器的

操作,可以通过Delphi提供的丰富的函数来实现。

6.1 文件类型和标准过程

我们处理的文件通常分为三种:文本文件、类型文件和无类型文件。以下几节是关于文

件输入/输出的讲解。文本文件指可被任意文本编辑器读取的ASCII文本。类型文件指包含由

程序员定义的数据类型的文件。无类型文件包含了其他所有的类型,它是对包含任意格式或

无格式数据的文件的统称。

file作为Pascal的保留字是一个类型说明符,通过file可以声明文件对象,也可以定义一些

新的类型,然后使用新的类型来声明文件对象。

6.1.1 文本文件(text file)

通过TextFile类型说明符可以用来声明ASCII字符的文件,也就是通常所说的“纯文本

文件”。

利用文本文件保存数据的优点是:利用常见的文字编辑器就可以浏览其中的内容。在后

面常用函数的介绍中,如果具体的函数对于上述三类文件有不同的用法时,将做必要的说明。

同时,通过这些说明,读者可以领会三种文件类型的不同。

本节讲述使用内建于Object Pascal运行时库中的过程和函数处理文本文件的方法。在对

文本文z件进行任何处理之前,首先要打开此文本文件。声明变量:

var

MyTextFile:Textfile;

通过此变量可以来引用一个文本文件。

打开一个文件需要两步:首先是AssignFile() ,它可以将文件变量与一个文件关联起来。

例如:

AssignFile(MyTextFile,’MyTextFile.txt’);

这时,可以进行第二步:打开文件。有三种方式可以打开文件:使用Rewrite过程创建

并打开文件;对于一个已存在的文件,此操作将使文件被覆盖;使用Reset过程只读地打开

一个文件;使用Append过程可以向已存在的文件追加文本。注意Reset将以可读写方式打开

类型文件和无类型文件。 134 第6章 文件管理

可以使用CloseFile来关闭一个已打开的文件。下面我们来看几个例子。

下面的程序将以只读方式打开一个文件:

var

MyTextFile:Textfile;

begin

assignfile(MyTextfile,’MyTextFile.txt’);

reset(MyTextFile);

try {操作文件}

finally

CloseFile(MyTextFile);

end;

end;

下面的程序将创建一个新的文件:

var

MyTextFile:Textfile;

begin

assignfile(MyTextfile,’MyTextFile.txt’);

rewrite(MyTextFile);

try {操作文件}

finally

CloseFile(MyTextFile);

end;

end;

下面的程序将向一个已存在的文件追加新的文本:

var

MyTextFile:Textfile;

begin

assignfile(MyTextfile,’MyTextFile.txt’);

append(MyTextFile);

try {操作文件}

finally

CloseFile(MyTextFile);

end;

end;

6.1.2 类型文件(typed file)

如果使用file声明文件对象时使用了一定的类型,例如Byte、Integer和用户自定义的类第6章 文件管理 135

型等,则称定义的文件为类型文件。就好像处理表中的记录一样,可以把Object Pascal的数

据结构保存到磁盘文件中,也可以将数据从文件中直接读入数据结构中。保存Pascal数据结

构的文件称为记录文件。为演示此类文件的使用,我们声明如下记录结构:

TPerson = packed record

FirstName:String[20];

LastName:String[20];

Age:Integer;

SocialCode:Integer;

end;

注意包含Ansi字符串、变量、类实例、接口或动态数组的记录不能写入类型文件中。

假设要在一个文件中保存一个或多个这样的记录。可以采用前面的方法,也可以通过声

明一个下面这样的记录来实现:

PersonFile:file of TPerson;

下列代码用来读取单独一条TPersonRec类型的记录。

var

PersonFile:file of TPerson;

Person:TPerson;

begin

assignfile(PersonFile,’PersonFile.dat’);

reset(PersonFile);

try

if not Eof(PersonFile) then

read(PersonFile,Person);

finally

CloseFile(PersonFile);

end;

end;

下列程序用来向文件中追加一条记录:

var

PersonFile:file of TPerson;

Person:TPerson;

begin

assignfile(PersonFile,’PersonFile.dat’);

reset(PersonFile);

seek(PersonFile,FileSize(PersonFile));

try

write(PersonFile,Person);

finally

CloseFile(PersonFile); 136 第6章 文件管理

end;

end;

注意,为使文件指针的位置位于末尾,在写记录前调用了Seek过程。这种用法将在后

面的章节中加以介绍。

6.1.3 无类型文件

到现在为止,我们已经学习了如何对文本文件和类型文件进行操作。其中,文本文件用

于存储ASCII字符序列;类型文件存储符合Pascal记录格式的数据。由于这种特性,这两种文

件的字节数目都可以通过代码来得到。

然而,不是所有文件都符合这种格式,例如:RTF文件。虽然RTF文件中也包含文本,

但是还有文本的格式属性。所以,对于RTF文件,并不是任何一种文本编辑器都可以完全识

别它,我们需要使用识别RTF格式的编辑器来进行游览。

下面是一个无类型文件的声明:

var

UnTypedFile:File;

这样就声明了一个由数据块序列组成的文件,每个数据块为128字节大小的数据。

现在,对无类型文件数据的读写操作就可以利用数据块实现。可以利用BlockRead从无

类型文件读出数据,也可以利用BlockWrite向无类型文件写入数据。这两个过程的声明如下:

procedure BlockRead(var F:File;var Buf;Count:Integer[;var Result:Integer]);

procedure BlockWrite(var F:File;var Buf;Count:Integer[;var Result:Integer]);

BlockRead和BlockWrite都至少有三个参数。第一个是无类型文件变量f;第二个是包含

写入或读出的数据的缓冲区变量Buf;Count则用来指定本次操作读写记录的数量。Result是

一个可选参数,当进行读操作时,它返回实际读取的记录数目;当进行写操作时,它返回实

际写入的记录数目。如果Result和Count数值不一致则可能是磁盘空间不足。

下面将演示如何读取或写入Count个记录。当声明一个无类型文件时,缺省为每个记录

有128字节大小的文件。

UnTypedFile:file;

以上无类型文件中的记录不同于特定的记录结构,它只是指定了一个数据块的大小。下

面的例子演示如何从一个文件中读取128字节的一个记录。

var

UnTypedFile:file;

Buf:array[0..128] of byte;

Num:Integer;

begin

assignfile(UnTypedFile,’UnTypedFile.dat’);

reset(UnTypedFile);

try 第6章 文件管理 137

BlockRead(UnTypedFile,Buf,1,Num);

finally

CloseFile(UnTypedFile);

end;

end;

这里,将文件UnTypedFile.dat打开并将128个字节的数据块读到缓冲区Buf中。下面的一

段程序演示如何向文件中写一个128字节的记录。

var

UnTypedFile:file;

Buf:array[0..128] of byte;

Num:Integer;

begin

assignfile(UnTypedFile,’UnTypedFile.dat’);

reset(UnTypedFile);

if FileExists(’UnTypedFile.dat’) then

Reset(UnTypedFile)

else

Rewrite(UnTypedFile);

try

Seek(UnTypedFile,FileSize(UnTypedFile));

FillChar(Buf,SizeOf(buf),’Y’);

BlockWrite(UnTypedFile,Buf,1,Num);

finally

CloseFile(UnTypedFile);

end;

end;

由于每个数据块默认大小为128个字节,这可能会导致这样一个问题:即如果文件的大

小不是128的整数倍,那么读至文件的末尾处将会超出文件范围。为了解决这个问题,我们

可以调用Reset()将记录大小指定为一个字节。这样,任意大小的文件都会是一字节的倍数。

6.1.4 文件对话框组件

Delphi的Dialog组件夹中提供了一些文件对话框组件,这些组件的用法简单,而且可以

使应用程序的界面统一、美观。具体如下:

1.TOpenDialog组件

通过TOpenDialog组件可以选择并打开文件。

在显示“打开文件”对话框之前,要对TOpenDialog组件的一些属性进行设置:

(1)Filter属性

文件类型过滤器。例如下面的代码在文件类型组合框中增加了.TXT和.PAS两种类型的

文件过滤器: