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两种类型的
文件过滤器: