Delphi 文件处理

1.文件类型概念
Delphi使用文件类型来读写存储在外部存储介质上的文件。一个文件变量能够与任意种类的外部设备建立通信,包括磁盘、打印机、键盘、绘图仪、调制解调器等。
例如,程序运行时可以从磁盘文件中读取数据,向磁盘文件写入数据;程序运行结束后,数据仍保存在磁盘文件中,不会丢失。

2.文件类型分类
根据文件中数据元素的数据类型,可将文件类型分为文本文件、类型文件和无类型 文件。
(1)文本文件。
元素类型是字符char,每个元素占用一个字节,以回车换行符表示每行结束。Delphi定义的标准文本文件类型是text或textfile,两个标识符同义。
(2)类型文件。
元素类型可以是整数、实数或记录等除文件以外的数据类型。每个元素所占的字节数由元素类型决定。
(3)无类型文件。
以字节byte为单位对文件中的二进制数据元素进行操作,而不管每个字节表示什么类型的数据元素。

3.文件与数组的区别
文件的定义与数组很像,都是由相同数据类型的数据元素组成的序列。但文件不同于数组,区别如下:
· 数组是由固定多个元素组成,而文件的长度是不定的,随机的。
· 数组元素总是存放在内存,而文件则往往与外部介质相联系。
· 数组元素以“数组名[下标]”的形式访问,而文件则需通过文件变量来访问。

9.3.2 类型文件操作
1.类型文件定义与变量声明
类型文件的类型定义格式如下:
type类型文件=file of数据类型;
其中,file、of是关键字,“数据类型”是文件的元素类型。例如:
type
intFile=file of integer; //整型文件类型
var
f:file of integer; //f是整型文件变量
文件的元素类型必须是固定长度的数据类型,不能是文件、动态数组、长字符串、指针或包含不固定长度域的记录类型。例如:
fx:file of intFile; //编译错,文件的元素类型不能是文件
Delphi中的字符串类型string,由于要支持长字符串,其大小是不固定的,因此不能作为文件的数据类型,但可以使用短字符串类型ShortString,因为它具有256字节的固定长度。当遇到string带长度时,Delphi会自动将string转换为ShortString类型,此时亦可作为文件的元素类型。例如:
var f1:file of ShortString; //ShortString类型为256个字节
f2:file of string[20]; //string[20]为20个字节
f3:file of string; //编译错,记录长度不确定
固定长度的记录类型可以作为文件的元素类型,但包含不固定长度域的记录类型则不可以。例如,以下定义的记录类型phoneEntry可以作为文件的元素类型:
type
phoneEntry = record
name: string[20];
phoneNumber: string[20];
address: string[100];
end;
phoneList = file of phoneEntry;

2.为文件变量指定相应文件
在使用文件变量进行文件操作之前,必须调用AssignFile过程建立文件变量与待操作文件之间的联系。
AssignFile过程声明如下:
procedure AssignFile(var f; filename:string);
其中,f为文件变量名,f声明为无类型的变量参数,声明为无类型参数是为了与所有文件类型兼容;FileName为文件名字符串,是包括文件名的全路径名。例如:
AssignFile(f,‘D:\Output.dat’);
指定了文件变量f与磁盘文件’D:\Output.dat’相关联,其后对变量f的操作都是针对指定文件的。

3.打开文件
指定文件名后,对文件操作之前,应先打开文件。有以下两种打开文件方式:
(1)Reset方式。
调用Reset过程打开一个已存在文件,然后可从文件中读取数据,也可向文件写入数据。Reset过程声明如下:
procedure Reset(var f [: File; RecSize: Word]);
打开文件变量f所指定的文件,文件变量指向文件开头的第一个元素。当指定文件不存在时,产生I/O异常EInOutError。

(2)Rewrite方式。
Rewrite过程声明如下:
procedure Rewrite(var f:File[; Recsize: Word]);
调用Rewrite过程,系统以f指定的文件名,在磁盘上创建一个空文件并准备写入数据。如果f指定文件已存在,则该文件将被覆盖,原有内容丢失。

4.读入文件
调用Reset打开文件后,可使用Read过程读取文件内容。过程声明如下:
procedure Read(var f, v1{, v2});
其中f为文件变量,v1、v2为待输入的变量名,v1等变量的数据类型是文件的元素 类型。
当读取整型和实型数据时,文件中的数据元素用空格分隔,且必须符合数据格式,否则将产生I/O错误。

5.判断文件是否结束
在读取文件之前,必须判断文件是否结束。只有未到文件结束点,才能读取数据。Eof函数声明如下:
function Eof(var f):Boolean;
当文件变量f指向文件尾部,读入文件结束标记时,表示文件结束,Eof函数返回True,否则返回False。

6.向文件写入数据
调用Rewrite打开文件后,使用Write过程向文件中写入数据。过程声明如下:
procedure Write(var f, v1{, v2});
向文件f中写入若干个文件元素型变量v1、v2的值。

7.关闭文件
无论是以Reset或Rewrite方式打开文件,在对文件操作完毕后,都必须使用CloseFile过程关闭文件,声明如下:
procedure CloseFile(var f);
关闭文件后,系统释放文件使用的资源。
以Rewrite方式打开文件,调用Write过程时,数据先写入内存缓冲区,只有缓冲区满或关闭文件时,才把数据真正写入磁盘中,并写入文件结束标记。如果写完数据后不关闭文件,可能造成数据的丢失。

9.3.3 文本文件操作
1.文本文件变量说明
Delphi定义了TextFile类型表示文本文件,它与Pascal语言中的Text类型完全相同。例如:
var f:TextFile; //声明文本文件变量f

2.文件类型共同的操作
与类型文件一样,对文本文件进行操作也需要以下几个步骤:
(1)声明文件变量f。
(2)调用AssignFile过程为文件变量f指定相关文件。
(3)调用Reset或Rewrite过程打开文件f。
(4)Reset打开文件,当未到文件尾,即Eof(f )返回false时,调用Read(f,i)过程,读入文件f的一个元素值存放在变量中。
(5)Rewrite打开文件时,调用Write(f,i)过程,将变量i的值写入文件f中。
(6)关闭指定文件CloseFile(f )。

3.仅用于文本文件的操作
(1)与类型文件定义不同的过程与函数。
对于文本文件,读、写等过程和函数的定义与类型文件定义有所不同,声明如下:
procedure Read([var f: Text;]v1{, v2));
function Eof[(var f:Text)]: boolean;
procedure Write([var f: Text;]p1{, p2});
(2)Append添加方式打开文件。
Append过程声明如下:
procedure Append(var f: Text);
调用Append过程打开文件,文件变量指向文件尾部,此后写入的数据添加在文件原有数据之后。如果文件不存在,则产生I/O异常。
(3)Readln按行读取字符串。
Readln过程声明如下:
procedure Readln([var f: Text;] v1{, v2});
Readln读取以回车换行符结束的一行字符串,之后跳过回车换行符,再读下一行。
(4)判断行是否结束。
对于文本文件,也可以调用Read(f,c)过程逐个地读取字符,此时可以使用Eoln函数判断行是否结束。Eoln函数声明如下:
function Eoln [(var f: Text) ]: boolean;
当文件变量f读取回车换行符时,表示一行结束,Eoln函数返回True,否则返回False。
对于文本文件,既可以调用Readln过程按行读取字符串,也可以调用Read过程逐个读取字符。需注意读入回车换行符时的操作,例如,Readln读完一行数据后,再使用Read读取字符串将得到空串。
以上所述Append、Writeln、Readln、Eoln例程只对文本文件有效,对类型文件无效。
数据既可以保存在类型文件中,也可以保存在文本文件中。两种方式各有所长,存于类型文件中,数据隐蔽性较强,但读取不方便,必须根据要求特别编写读入程序;存于文本文件中,可使用记事本等多种工具打开文本文件,不必特别编写读入程序,但数据是公开的,无法隐藏。实际应用时,可根据需求有所选择。

4.标准输入输出
由于键盘和显示器是操作系统默认的标准输入/输出设备,操作系统对设备的访问也是基于文件进行的,并且标准输入/输出文件都是以字符为基本元素的文本文件。
为此,Delphi定义了两个默认的文本文件变量Input和Output,用于处理标准的输入与输出操作。
Input代表标准输入文本文件,即键盘;Output代表标准输出文本文件,即显 示器。
平时我们所说的读和写语句,实际上是从Input文件中读入变量值,或向Output文件写入指定变量的值,其中省略了默认变量Input和Output的形式。例如,下列两条语句 等价:
Read(i, j); //从Input文件中读入变量值,省略Input
Read(input, i, j); //从Input文件中读入变量值

虽然Input是文本文件,但从Input文件中可以读入非字符的整数类型等变量值,系统已经自动进行了数据类型的转换,这一功能是普通文本文件所没有的。
下列语句两两等价:
Readln(i,j); 与 Readln(input, i,j);
Readln(); 与 Readln(input);
Write(i,j); 与 Write(output,i,j);
Writeln(i,j);与 Writeln(output, i,j);
Writeln(); 与 Writeln(output);

9.3.4 无类型文件操作
仅以file声明的文件变量称为无类型文件变量。例如:
var f: file;
无类型文件变量f代表二进制字节文件,而不管每个字节表示什么类型的数据元素。
对无类型文件的读/写操作由BlockRead和BlockWrite过程实现,它们以二进制数据块为单位,通常一个数据块为128个字节,一次可读或写若干数据块。

9.3.5 文件的随机操作
除了顺序存取,文件还有随机存取方式,即按记录位置的编号进行读/写操作,通常对记录式文件采用随机存取方式,而对文本文件这种字符流式文件则不采用随机存取方式。
有关随机存取的操作如下,这些操作仅用于类型文件和无类型文件,不能用于文本 文件。
function FileSize(var f: file): Int64; //返回文件长度,即记录总数
function FilePos(var f: file): Int64; //返回文件当前记录编号
procedure Seek(var f: file, n: integer); //跳过n个记录位置
procedure Truncate(var f: file); //截断文件
记录编号通常从0开始计数。给定一个记录编号,调用Seek(f,n)过程,文件的读/写指针将从当前记录位置处跳过n个记录,定位在所需的记录位置处,进行读/写操作。调用Truncate(f ) 过程将文件从当前记录处截断,从当前记录至文件尾的若干记录则被删除。
采用顺序存取方式,通常将读文件和写文件的操作分开进行,以Reset( )方式打开文件准备读,以Rewrite( )方式打开新文件准备写,读和写操作分别进行。
实际上,对于可读写的类型文件和无类型文件,以Reset( )和Rewrite( )两种方式打开文件,既可以读取数据也可以写入数据,同时支持随机存取方式。
以Reset( )方式打开文件时,文件的原有内容仍保留,系统设置的文件指针定位于第一个记录,记录号为0。此时,如果写数据,则将原第一个记录内容覆盖。例如:
Reset(f); //当前记录号为0
Write(f,p); //覆盖当前记录内容
如果将文件指针定位于文件尾,则可在原文件之后增加新内容。例如:
Reset(f);
Seek(f,FileSize(f)); //定位到文件尾
Write(f,p); //追加记录
以Rewrite( )方式打开文件时,文件原有内容不保留,文件指针定位于第一个记录,记
录号为0,这是要写入的记录位置。写入若干记录后,可以改变文件指针,再读记录, 例如:
Rewrite(f);
Write(f ,p);
Write(f ,p);
Seek(f,0);
Read(f,p); //读出第一个记录

9.3.6 与文件目录相关的标准过程和函数
Delphi在System、SysUtils等单元中定义了与文件和目录操作有关的若干过程/函数。
1.System单元中与目录操作有关的过程/函数
procedure ChDir(const s: string); //改变当前目录
procedure MkDir(const s: string); //创建一个新的子目录S
procedure RmDir(const s: string); //删除一个空的目录S
function Flush(var t:Text): integer; //清空文本输出缓冲区
function IOResult: integer; //返回I/O操作状态。
procedure Move(const Source; var Dest; Count: Integer);
//将源数据块以字节形式拷贝至目的数据块

2.SysUtils单元中与文件操作有关的过程/函数
function GetCurrentDir: string; //返回当前目录路径名
function SetCurrentDir(const Dir: string): Boolean; //设置当前目录
function FileCreate(const FileName: string):Integer; //创建文件
function FileExists(const FileName: string): Boolean; //判断指定文件是否存在
function CreateDir(const Dir: string): Boolean; //创建新目录
function ExpandFileName(const FileName: string): string;
//从文件名返回完整的文件路径名
function ExtractFileDir(const FileName: string): string;
//从文件路径名中返回目录路径名
function ExtractFileName(const FileName: string): string;
//从文件路径名中返回文件名和扩展名
function ExtractFileExt(const FileName: string): string;
//从文件路径名中返回扩展名
function DeleteFile(const FileName: string): Boolean; //删除指定文件
function RenameFile(const OldName, NewName: string): Boolean;
//重命名指定文件
function FileGetAttr(const FileName:string):Integer; //返回指定文件的属性
function DiskSize(Drive: Byte): Int64; //返回指定驱动器的总容量
function DiskFree(Drive: Byte): Int64; //返回指定驱动器的剩余磁盘空间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows中的通用应用程序的类名 使用API函数复制移动文件 使用API访问ListBox项 使用GetTempFileName创建一个唯一的临时文件 使用INI文件 使用INI文件保存、装载字体信息 使用TFileStream 使用TStream保存字符串 使用TTreeview显示目录 使窗体的关闭按钮失效 修改文本文件 允许在资源管理器中拖放文件 减小EXE文件大小 列举驱动器 列出目录下的子目录 创建快捷方式 创建目录 删除文件到回收站 判断文件夹是否共享 剪贴板存放多个控件流 加载CDROM图标 压缩和解压流 取MP3的ID3-Tag 取Program files目录 取可执行文件 取和文件关联的应用程序 取当前程序所在目录 取指定文件的版本信息 取文件修改日期 取文件日期 取文件最后访问日期 取文件版本号 取文件的所有者 取目录大小 取磁盘可用空间和总空间 取设置当前目录 取设置文件夹的日期 向Exe文件中添加数据文件写添加文本 在TMemo光标位置插入一个文件 在Windows开始后自动运行一个程序 在应用程序中添加Exe文件并且执行 在文件中搜索字符串 在文件中搜索指定文本 在文本文件中搜索文本 将剪贴板复制到流和恢复 将文本文件赋值给一个字符串 将资源文件中Rft文本装载到TRichEdit 将长文件名转换成短文件名 彻底删除文件 打开资源管理器且显示指定文件夹 捕获DOS应用程序的输出 改变TPageControls的颜色 改名、移动、删除文件或目录 显示‘打开方式’对话框 显示文件属性对话框 显示目录选择对话框 显示目录选择对话框并指定初始目录 替换正运行的DLL 检查文件是否ASCII格式 检查文件是否在本地驱动器 检查文件是否已打开 检查文件是否正在使用 检查目录是否存在 比较两个文件是否相同 添加去掉路径名后的符号 添加文件到文档菜单 清空文档 获取文件 获得快捷方式信息 获得文件大小 计算文件的校验和 设置文件日期 读 table-textfile 到 StringGrid 读取二进制文件使用ASCII显示 转换OEM到ANSI 转换短文件名为长文件名 运行一个程序或打开一个关联文件 返回UNC路径 通过CRC-32验证文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值