📄 016.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基础教程-->第六章 文件管理(一)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基础教程 第六章 文件管理(一)">
<META NAME="description" CONTENT=" - DELPHI基础教程 - 第六章 文件管理(一)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 background="bg.gif" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" background="bg.gif"><strong><A HREF="017.htm" ><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="015.htm" ><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>
<A HREF="index.html" ><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
<TD class="tt2" background="bg.gif" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">第六章 文件管理(一)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p align="center"><font face="宋体" lang="ZH-CN">
文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁盘文件,这也是本章我们主要讨论的对象。</font></p>
<p> Delphi<font face="宋体" lang="ZH-CN">继承了</font>Object
Pascal<font face="宋体" lang="ZH-CN">的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准控件,同时也提供了更多的文件管理函数。利用</font>Delphi<font
face="宋体" lang="ZH-CN">的强大功能,开发一个自己的文件管理系统就成为很容易的事。</p>
</font><p><font face="宋体" lang="ZH-CN">
本章首先介绍</font>Delphi<font
face="宋体" lang="ZH-CN">文件管理的基本概念和标准过程</font>/<font
face="宋体" lang="ZH-CN">函数,并提供了一个记录文件的应用实例,这是从我们实际课题开发中提取出来的。而后介绍</font>Delphi<font
face="宋体" lang="ZH-CN">提供的文件控件的使用方法。最后提供的一个综合例程</font>MDI<font
face="宋体" lang="ZH-CN">文件管理器则是对</font>Delphi<font face="宋体"
lang="ZH-CN">文件管理功能的综合应用。</p>
</font><p align="center">6.1 <font face="宋体" lang="ZH-CN">文件类型和标准过程 </p>
</font><p> Delphi<font face="宋体"
lang="ZH-CN">同</font>Object Pascal<font face="宋体" lang="ZH-CN">一样支持三种文件类型,即:文本文件、记录文件、无类型文件。 </p>
</font><p>6.1.1<font face="宋体" lang="ZH-CN">文本文件 </p>
</font><p><font face="宋体" lang="ZH-CN">
文本文件类型的变量用如下方法声明:</p>
</font><p>var</p>
<p>TextFileVar: Text ; </p>
<p><font face="宋体" lang="ZH-CN">
文本文件是以行为单位进行读、写操作的。由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。而且文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。 </p>
</font><p>6.1.1.1 <font face="宋体" lang="ZH-CN">文本文件的打开、关闭 </p>
</font><p><font face="宋体" lang="ZH-CN">
文本文件的打开需要两个步骤:</font>(1). <font
face="宋体" lang="ZH-CN">文件变量与文件名关联;</font>(2). <font
face="宋体" lang="ZH-CN">初始化读写。</p>
</font><p><font face="宋体" lang="ZH-CN">
联文件变量与文件名调用</font>AssignFile<font
face="宋体" lang="ZH-CN">标准过程: </p>
</font><p>AssignFile ( TextFileVar , FileName ) ; </p>
<p> FileName <font face="宋体" lang="ZH-CN">既可以是全路径名,也可以仅是文件名。对于后者系统将在当前目录下查找。</font></p>
<p> AssignFile<font face="宋体" lang="ZH-CN">是</font>Delphi<font
face="宋体" lang="ZH-CN">新提供的一个函数,其功能等价于</font>Object
Pascal<font face="宋体" lang="ZH-CN">中的</font>Assign<font face="宋体" lang="ZH-CN">。而</font>Assign<font
face="宋体" lang="ZH-CN">在</font>Delphi<font face="宋体" lang="ZH-CN">中更多地被用作一个方法名。</p>
<p>初始化读写有三种方式:</p>
</font><p>1. Reset : <font face="宋体" lang="ZH-CN">为读打开文件并把文件指针移动到文件首;</p>
</font><p>2. Rewrite : <font face="宋体" lang="ZH-CN">为写创建一个新文件;</p>
</font><p>3. Append : <font face="宋体" lang="ZH-CN">为写打开存在的文件并把文件指针定位在文件尾。</p>
</font><p><font face="宋体" lang="ZH-CN">
当使用</font>Reset<font face="宋体"
lang="ZH-CN">或</font>Append<font face="宋体" lang="ZH-CN">过程而文件不存在时将会引发一个</font>I/O<font
face="宋体" lang="ZH-CN">异常。有关</font>I/O<font face="宋体" lang="ZH-CN">异常的处理请参看本章例程和第十二章中的介绍。</p>
</font><p><font face="宋体" lang="ZH-CN">
文件的关闭很简单,只须调用</font>CloseFile<font
face="宋体" lang="ZH-CN">过程即可。</p>
</font><p><font face="宋体" lang="ZH-CN">
虽然</font>Delphi<font face="宋体"
lang="ZH-CN">应用程序在退出时会自动关闭所有打开的文件,但自己动手关闭文件可以确保释放文件句柄,并使程序的可移植性增强。</p>
</font><p><font face="宋体" lang="ZH-CN">
为保持兼容,</font>Delphi<font
face="宋体" lang="ZH-CN">也允许用户用</font>Assign<font face="宋体" lang="ZH-CN">建立关联,</font>Close<font
face="宋体" lang="ZH-CN">关闭文件。 </p>
</font><p>6.1.1.2 <font face="宋体" lang="ZH-CN">文本文件的读写 </p>
</font><p><font face="宋体" lang="ZH-CN">
从文本文件中读取信息用</font>Read<font
face="宋体" lang="ZH-CN">、</font>Readln<font face="宋体" lang="ZH-CN">两个标准过程。</p>
</font><p><font face="宋体" lang="ZH-CN">
当读入数值时,</font>Read<font
face="宋体" lang="ZH-CN">、</font>Readln<font face="宋体" lang="ZH-CN">假定数值是用一个或多个空格分开的,而不是逗号、分号或其它字符。对如下一条语句: </p>
</font><p>Read ( TextFileVar , Num1 , Num2 , Num3 ) ; </p>
<p><font face="宋体" lang="ZH-CN">
如果文件中的数值是:</p>
</font><p>100 200 300</p>
<p><font face="宋体" lang="ZH-CN">
则能够成功读入,而若文件中的数值是</p>
</font><p>100 200<font face="宋体" lang="ZH-CN">, </font>300</p>
<p><font face="宋体" lang="ZH-CN"> 则</font>Read<font
face="宋体" lang="ZH-CN">读入“</font>200<font face="宋体" lang="ZH-CN">,”并试图把它转化成一个数值时会引发一个异常。</p>
</font><p><font face="宋体" lang="ZH-CN">
当读入字符是字符串时,</font>Read<font
face="宋体" lang="ZH-CN">、</font>Readln<font face="宋体" lang="ZH-CN">过程总是读取尽可能多的字符填充到字符串变量中或一直读到行结束符为止。因此从文本文件中读取格式化的字符串数据,必须声明与其长度相匹配的字符串变量。如果要从文件中读取单词,必须先把文件中的每一行读入字符串,然后再从字符串中逐个分析出单词。或者一次只从文本文件中读入一个字符并测试每个字符后是否是单词断开处。</p>
</font><p><font face="宋体" lang="ZH-CN">
格式化字符串之间的分隔符应读入到一个临时变量中,而字符串与数值、数值与数值间的分隔符读入时会自动识别剔除。对如下一行数据:</p>
</font><p>Mon 12:10 40 50</p>
<p><font face="宋体" lang="ZH-CN">定义 </p>
</font><p>var</p>
<p>Day: string[3] ;</p>
<p>Time: string[5] ;</p>
<p>Num1, Num2: Integer ; </p>
<p><font face="宋体" lang="ZH-CN">则须用如下的</font>read <font face="宋体"
lang="ZH-CN">语句读入: </font></p>
<p>read ( TextFileVar , Day , c , Time , Num1 , Num2 ) ; </p>
<p>C<font face="宋体" lang="ZH-CN">为一个临时字符变量。 </p>
</font><p>6.1.1.3 <font face="宋体" lang="ZH-CN">文本文件的编辑 </p>
</font><p><font face="宋体" lang="ZH-CN"> 在</font>Delphi<font
face="宋体" lang="ZH-CN">中实现对一个文本文件的编辑,只须让其与一个</font>Tmemo<font
face="宋体" lang="ZH-CN">控件建立关联即可: </p>
</font><p>Memo1.Lines.LoadFromFile ( TextFileName ) ; </p>
<p><font face="宋体" lang="ZH-CN">这样在</font>TMemo<font face="宋体" lang="ZH-CN">上所做的一切修改当调用</font>Memo<font
face="宋体" lang="ZH-CN">部件的</font>SaveToFile<font face="宋体" lang="ZH-CN">方法后都会反映到文件中去。 </p>
</font><p>6.1.2 <font face="宋体" lang="ZH-CN">记录文件 </p>
</font><p><font face="宋体" lang="ZH-CN">
记录文件是一种操作更为灵活的文件类型。它允许同时为读和写打开,而且由于记录文件中每条记录的长度固定,所以可随机存取。</p>
<p>记录文件的类型变量可如下声明: </p>
</font><p>var</p>
<p>RecordFileVar: file of RecordType; </p>
<p>RecordType<font face="宋体" lang="ZH-CN">是一个自定义的记录类型。</p>
</font><p><font face="宋体" lang="ZH-CN">
有关记录文件的操作我们将在下一节中结合例程进行讨论。 </p>
</font><p>6.1.3 <font face="宋体" lang="ZH-CN">无类型文件 </p>
</font><p><font face="宋体" lang="ZH-CN">
无类型文件提供了底层的</font>I/O<font
face="宋体" lang="ZH-CN">通道,可用于存取可变长度记录的文件。经常用于文件的复制操作中。由于</font>Delphi<font
face="宋体" lang="ZH-CN">提供了更好的方法</font>(<font face="宋体"
lang="ZH-CN">见第四节</font>)<font face="宋体" lang="ZH-CN">,所以无类型文件很少使用。有兴趣的读者可参看</font>BlockRead<font
face="宋体" lang="ZH-CN">、</font>BlockWrite<font face="宋体" lang="ZH-CN">两个联机帮助主题。 </p>
</font><p>6.1.4 Delphi<font face="宋体" lang="ZH-CN">的文件管理标准过程 </p>
</font><p><font face="宋体" lang="ZH-CN">
根据功能我们把标准过程划分为十一类进行介绍。 </p>
</font><p>6.1.4.1 <font face="宋体" lang="ZH-CN">文件的打开与关闭 </p>
</font><p>AssignFile <font face="宋体" lang="ZH-CN">:
把一个外部文件名和一个文件变量相关联</p>
</font><p>Reset <font face="宋体" lang="ZH-CN">:打开一个存在的文件</p>
</font><p>Rewrite <font face="宋体" lang="ZH-CN">:创建并打开一个新文件(或覆盖原有文件)</p>
</font><p>Append <font face="宋体" lang="ZH-CN">:
以添加方式打开一个文件(只适用于文本文件)</p>
</font><p>CloseFile <font face="宋体" lang="ZH-CN">: 关闭一个打开的文件</p>
</font><p>FileOpen <font face="宋体" lang="ZH-CN">:打开一个特定的文件并返回文件句柄</p>
</font><p>FileCreate <font face="宋体" lang="ZH-CN">:创建一个给定文件名的文件并返回文件句柄</p>
</font><p>FileClose <font face="宋体" lang="ZH-CN">:
关闭一个特定句柄的文件 </p>
</font><p><font face="宋体" lang="ZH-CN">
后边三个文件主要供系统内部使用,在文件复制的编程中也往往会用到。它们操作的对象是文件句柄而不是文件变量。 </p>
</font><p>6.1.4.2 <font face="宋体" lang="ZH-CN">文件定位 </p>
</font><p>Seek <font face="宋体" lang="ZH-CN">:
把文件当前位置移到指定部分</p>
</font><p>FilePos <font face="宋体" lang="ZH-CN">: 返回文件的当前位置</p>
</font><p>Eoln <font face="宋体" lang="ZH-CN">: 返回行结束标志</p>
</font><p>EOF <font face="宋体" lang="ZH-CN">: 返回文件结束标志</p>
</font><p>FileSeek <font face="宋体" lang="ZH-CN">:</font> <font face="宋体"
lang="ZH-CN">改变当前文件指针的位置</font></p>
<p> Seek<font face="宋体" lang="ZH-CN">与</font>FileSeek<font
face="宋体" lang="ZH-CN">的区别是:</font>1. Seek<font face="宋体" lang="ZH-CN">仅用于记录文件;</font>2.
FileSeek<font face="宋体" lang="ZH-CN">的参数是文件句柄、偏移量、起始位置。其中起始位置有文件首、当前位置、文件尾三种选择。</font>Seek<font
face="宋体" lang="ZH-CN">的参数是文件变量、偏移量,偏移量是从文件首开始定位的。</font>3.
FileSeek<font face="宋体" lang="ZH-CN">的偏移量以字节数来计算,而</font>Seek<font
face="宋体" lang="ZH-CN">是根据记录号进行移动。</font> </p>
<p> Seek<font face="宋体" lang="ZH-CN">、</font>FilePos<font
face="宋体" lang="ZH-CN">仅用于记录文件。但任何文件都可以看作是基于字节的记录文件。下面一段程序表示了它们的用法。</font></p>
<p>{ <font face="宋体" lang="ZH-CN">该例子的设计界面为一个包含</font>TOpenDialog<font
face="宋体" lang="ZH-CN">部件的窗体。} </p>
</font><p>uses Dialogs;</p>
<p>var</p>
<p>f: file of Byte;</p>
<p>size: Longint;</p>
<p>S: String;</p>
<p>y: Integer;</p>
<p>begin</p>
<p>if OpenDialog1.Execute then </p>
<p>begin</p>
<p>AssignFile(f, OpenDialog1.FileName);</p>
<p>Reset(f);</p>
<p>size := FileSize(f);</p>
<p>S := 'File size in bytes: ' + IntToStr(size);</p>
<p>y := 10;</p>
<p>Canvas.TextOut(5, y, S);</p>
<p>y := y + Canvas.TextHeight(S) + 5;</p>
<p>S := 'Seeking halfway into file...';</p>
<p>Canvas.TextOut(5, y, S);</p>
<p>y := y + Canvas.TextHeight(S) + 5;</p>
<p>Seek(f,size div 2);</p>
<p>S := 'Position is now ' + IntToStr(FilePos(f));</p>
<p>Canvas.TextOut(5, y, S);</p>
<p>CloseFile(f);</p>
<p>end;</p>
<p>end. </p>
<p>6.1.4.3 <font face="宋体" lang="ZH-CN">文件删除与截断 </p>
</font><p>Erase <font face="宋体" lang="ZH-CN">: 删除一个存在的文件</p>
</font><p>DeleteFile <font face="宋体" lang="ZH-CN">: 删除一个文件</p>
</font><p>Truncate <font face="宋体" lang="ZH-CN">:
从文件当前位置将文件截断 </p>
</font><p> Erase<font face="宋体"
lang="ZH-CN">与</font>DeleteFile<font face="宋体" lang="ZH-CN">的区别是:</font>Erase<font
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -