?? 016.htm
字號(hào):
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基礎(chǔ)教程-->第六章 文件管理(一)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基礎(chǔ)教程 第六章 文件管理(一)">
<META NAME="description" CONTENT=" - DELPHI基礎(chǔ)教程 - 第六章 文件管理(一)">
<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">后一頁(yè)</font></A><BR>
<A HREF="015.htm" ><FONT style="FONT-SIZE: 9pt">前一頁(yè)</font></A><BR>
<A HREF="index.html" ><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁(yè)</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">
文件是同一類型元素的有序集合,是內(nèi)存與外設(shè)間傳輸數(shù)據(jù)的渠道。一些外設(shè)如顯示器、鍵盤、打印機(jī)等都可以看作文件,但最常用的還是磁盤文件,這也是本章我們主要討論的對(duì)象。</font></p>
<p> Delphi<font face="宋體" lang="ZH-CN">繼承了</font>Object
Pascal<font face="宋體" lang="ZH-CN">的文件管理功能,并有很大的發(fā)展,其中最主要的是提供了用于文件管理的標(biāo)準(zhǔn)控件,同時(shí)也提供了更多的文件管理函數(shù)。利用</font>Delphi<font
face="宋體" lang="ZH-CN">的強(qiáng)大功能,開(kāi)發(fā)一個(gè)自己的文件管理系統(tǒng)就成為很容易的事。</p>
</font><p><font face="宋體" lang="ZH-CN">
本章首先介紹</font>Delphi<font
face="宋體" lang="ZH-CN">文件管理的基本概念和標(biāo)準(zhǔn)過(guò)程</font>/<font
face="宋體" lang="ZH-CN">函數(shù),并提供了一個(gè)記錄文件的應(yīng)用實(shí)例,這是從我們實(shí)際課題開(kāi)發(fā)中提取出來(lái)的。而后介紹</font>Delphi<font
face="宋體" lang="ZH-CN">提供的文件控件的使用方法。最后提供的一個(gè)綜合例程</font>MDI<font
face="宋體" lang="ZH-CN">文件管理器則是對(duì)</font>Delphi<font face="宋體"
lang="ZH-CN">文件管理功能的綜合應(yīng)用。</p>
</font><p align="center">6.1 <font face="宋體" lang="ZH-CN">文件類型和標(biāo)準(zhǔn)過(guò)程 </p>
</font><p> Delphi<font face="宋體"
lang="ZH-CN">同</font>Object Pascal<font face="宋體" lang="ZH-CN">一樣支持三種文件類型,即:文本文件、記錄文件、無(wú)類型文件。 </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">
文本文件是以行為單位進(jìn)行讀、寫操作的。由于每一行長(zhǎng)度不一定相同,不能計(jì)算出給定行在文件中的確切位置,因而只能順序地讀寫。而且文本文件只能單獨(dú)為讀或?qū)懚蜷_(kāi),在一個(gè)打開(kāi)的文本文件上同時(shí)進(jìn)行讀、寫操作是不允許的。 </p>
</font><p>6.1.1.1 <font face="宋體" lang="ZH-CN">文本文件的打開(kāi)、關(guān)閉 </p>
</font><p><font face="宋體" lang="ZH-CN">
文本文件的打開(kāi)需要兩個(gè)步驟:</font>(1). <font
face="宋體" lang="ZH-CN">文件變量與文件名關(guān)聯(lián);</font>(2). <font
face="宋體" lang="ZH-CN">初始化讀寫。</p>
</font><p><font face="宋體" lang="ZH-CN">
聯(lián)文件變量與文件名調(diào)用</font>AssignFile<font
face="宋體" lang="ZH-CN">標(biāo)準(zhǔn)過(guò)程: </p>
</font><p>AssignFile ( TextFileVar , FileName ) ; </p>
<p> FileName <font face="宋體" lang="ZH-CN">既可以是全路徑名,也可以僅是文件名。對(duì)于后者系統(tǒng)將在當(dāng)前目錄下查找。</font></p>
<p> AssignFile<font face="宋體" lang="ZH-CN">是</font>Delphi<font
face="宋體" lang="ZH-CN">新提供的一個(gè)函數(shù),其功能等價(jià)于</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">中更多地被用作一個(gè)方法名。</p>
<p>初始化讀寫有三種方式:</p>
</font><p>1. Reset : <font face="宋體" lang="ZH-CN">為讀打開(kāi)文件并把文件指針移動(dòng)到文件首;</p>
</font><p>2. Rewrite : <font face="宋體" lang="ZH-CN">為寫創(chuàng)建一個(gè)新文件;</p>
</font><p>3. Append : <font face="宋體" lang="ZH-CN">為寫打開(kāi)存在的文件并把文件指針定位在文件尾。</p>
</font><p><font face="宋體" lang="ZH-CN">
當(dāng)使用</font>Reset<font face="宋體"
lang="ZH-CN">或</font>Append<font face="宋體" lang="ZH-CN">過(guò)程而文件不存在時(shí)將會(huì)引發(fā)一個(gè)</font>I/O<font
face="宋體" lang="ZH-CN">異常。有關(guān)</font>I/O<font face="宋體" lang="ZH-CN">異常的處理請(qǐng)參看本章例程和第十二章中的介紹。</p>
</font><p><font face="宋體" lang="ZH-CN">
文件的關(guān)閉很簡(jiǎn)單,只須調(diào)用</font>CloseFile<font
face="宋體" lang="ZH-CN">過(guò)程即可。</p>
</font><p><font face="宋體" lang="ZH-CN">
雖然</font>Delphi<font face="宋體"
lang="ZH-CN">應(yīng)用程序在退出時(shí)會(huì)自動(dòng)關(guān)閉所有打開(kāi)的文件,但自己動(dòng)手關(guān)閉文件可以確保釋放文件句柄,并使程序的可移植性增強(qiáng)。</p>
</font><p><font face="宋體" lang="ZH-CN">
為保持兼容,</font>Delphi<font
face="宋體" lang="ZH-CN">也允許用戶用</font>Assign<font face="宋體" lang="ZH-CN">建立關(guān)聯(lián),</font>Close<font
face="宋體" lang="ZH-CN">關(guān)閉文件。 </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">兩個(gè)標(biāo)準(zhǔn)過(guò)程。</p>
</font><p><font face="宋體" lang="ZH-CN">
當(dāng)讀入數(shù)值時(shí),</font>Read<font
face="宋體" lang="ZH-CN">、</font>Readln<font face="宋體" lang="ZH-CN">假定數(shù)值是用一個(gè)或多個(gè)空格分開(kāi)的,而不是逗號(hào)、分號(hào)或其它字符。對(duì)如下一條語(yǔ)句: </p>
</font><p>Read ( TextFileVar , Num1 , Num2 , Num3 ) ; </p>
<p><font face="宋體" lang="ZH-CN">
如果文件中的數(shù)值是:</p>
</font><p>100 200 300</p>
<p><font face="宋體" lang="ZH-CN">
則能夠成功讀入,而若文件中的數(shù)值是</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">,”并試圖把它轉(zhuǎn)化成一個(gè)數(shù)值時(shí)會(huì)引發(fā)一個(gè)異常。</p>
</font><p><font face="宋體" lang="ZH-CN">
當(dāng)讀入字符是字符串時(shí),</font>Read<font
face="宋體" lang="ZH-CN">、</font>Readln<font face="宋體" lang="ZH-CN">過(guò)程總是讀取盡可能多的字符填充到字符串變量中或一直讀到行結(jié)束符為止。因此從文本文件中讀取格式化的字符串?dāng)?shù)據(jù),必須聲明與其長(zhǎng)度相匹配的字符串變量。如果要從文件中讀取單詞,必須先把文件中的每一行讀入字符串,然后再?gòu)淖址兄饌€(gè)分析出單詞。或者一次只從文本文件中讀入一個(gè)字符并測(cè)試每個(gè)字符后是否是單詞斷開(kāi)處。</p>
</font><p><font face="宋體" lang="ZH-CN">
格式化字符串之間的分隔符應(yīng)讀入到一個(gè)臨時(shí)變量中,而字符串與數(shù)值、數(shù)值與數(shù)值間的分隔符讀入時(shí)會(huì)自動(dòng)識(shí)別剔除。對(duì)如下一行數(shù)據(jù):</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">語(yǔ)句讀入: </font></p>
<p>read ( TextFileVar , Day , c , Time , Num1 , Num2 ) ; </p>
<p>C<font face="宋體" lang="ZH-CN">為一個(gè)臨時(shí)字符變量。 </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">中實(shí)現(xiàn)對(duì)一個(gè)文本文件的編輯,只須讓其與一個(gè)</font>Tmemo<font
face="宋體" lang="ZH-CN">控件建立關(guān)聯(lián)即可: </p>
</font><p>Memo1.Lines.LoadFromFile ( TextFileName ) ; </p>
<p><font face="宋體" lang="ZH-CN">這樣在</font>TMemo<font face="宋體" lang="ZH-CN">上所做的一切修改當(dāng)調(diào)用</font>Memo<font
face="宋體" lang="ZH-CN">部件的</font>SaveToFile<font face="宋體" lang="ZH-CN">方法后都會(huì)反映到文件中去。 </p>
</font><p>6.1.2 <font face="宋體" lang="ZH-CN">記錄文件 </p>
</font><p><font face="宋體" lang="ZH-CN">
記錄文件是一種操作更為靈活的文件類型。它允許同時(shí)為讀和寫打開(kāi),而且由于記錄文件中每條記錄的長(zhǎng)度固定,所以可隨機(jī)存取。</p>
<p>記錄文件的類型變量可如下聲明: </p>
</font><p>var</p>
<p>RecordFileVar: file of RecordType; </p>
<p>RecordType<font face="宋體" lang="ZH-CN">是一個(gè)自定義的記錄類型。</p>
</font><p><font face="宋體" lang="ZH-CN">
有關(guān)記錄文件的操作我們將在下一節(jié)中結(jié)合例程進(jìn)行討論。 </p>
</font><p>6.1.3 <font face="宋體" lang="ZH-CN">無(wú)類型文件 </p>
</font><p><font face="宋體" lang="ZH-CN">
無(wú)類型文件提供了底層的</font>I/O<font
face="宋體" lang="ZH-CN">通道,可用于存取可變長(zhǎng)度記錄的文件。經(jīng)常用于文件的復(fù)制操作中。由于</font>Delphi<font
face="宋體" lang="ZH-CN">提供了更好的方法</font>(<font face="宋體"
lang="ZH-CN">見(jiàn)第四節(jié)</font>)<font face="宋體" lang="ZH-CN">,所以無(wú)類型文件很少使用。有興趣的讀者可參看</font>BlockRead<font
face="宋體" lang="ZH-CN">、</font>BlockWrite<font face="宋體" lang="ZH-CN">兩個(gè)聯(lián)機(jī)幫助主題。 </p>
</font><p>6.1.4 Delphi<font face="宋體" lang="ZH-CN">的文件管理標(biāo)準(zhǔn)過(guò)程 </p>
</font><p><font face="宋體" lang="ZH-CN">
根據(jù)功能我們把標(biāo)準(zhǔn)過(guò)程劃分為十一類進(jìn)行介紹。 </p>
</font><p>6.1.4.1 <font face="宋體" lang="ZH-CN">文件的打開(kāi)與關(guān)閉 </p>
</font><p>AssignFile <font face="宋體" lang="ZH-CN">:
把一個(gè)外部文件名和一個(gè)文件變量相關(guān)聯(lián)</p>
</font><p>Reset <font face="宋體" lang="ZH-CN">:打開(kāi)一個(gè)存在的文件</p>
</font><p>Rewrite <font face="宋體" lang="ZH-CN">:創(chuàng)建并打開(kāi)一個(gè)新文件(或覆蓋原有文件)</p>
</font><p>Append <font face="宋體" lang="ZH-CN">:
以添加方式打開(kāi)一個(gè)文件(只適用于文本文件)</p>
</font><p>CloseFile <font face="宋體" lang="ZH-CN">: 關(guān)閉一個(gè)打開(kāi)的文件</p>
</font><p>FileOpen <font face="宋體" lang="ZH-CN">:打開(kāi)一個(gè)特定的文件并返回文件句柄</p>
</font><p>FileCreate <font face="宋體" lang="ZH-CN">:創(chuàng)建一個(gè)給定文件名的文件并返回文件句柄</p>
</font><p>FileClose <font face="宋體" lang="ZH-CN">:
關(guān)閉一個(gè)特定句柄的文件 </p>
</font><p><font face="宋體" lang="ZH-CN">
后邊三個(gè)文件主要供系統(tǒng)內(nèi)部使用,在文件復(fù)制的編程中也往往會(huì)用到。它們操作的對(duì)象是文件句柄而不是文件變量。 </p>
</font><p>6.1.4.2 <font face="宋體" lang="ZH-CN">文件定位 </p>
</font><p>Seek <font face="宋體" lang="ZH-CN">:
把文件當(dāng)前位置移到指定部分</p>
</font><p>FilePos <font face="宋體" lang="ZH-CN">: 返回文件的當(dāng)前位置</p>
</font><p>Eoln <font face="宋體" lang="ZH-CN">: 返回行結(jié)束標(biāo)志</p>
</font><p>EOF <font face="宋體" lang="ZH-CN">: 返回文件結(jié)束標(biāo)志</p>
</font><p>FileSeek <font face="宋體" lang="ZH-CN">:</font> <font face="宋體"
lang="ZH-CN">改變當(dāng)前文件指針的位置</font></p>
<p> Seek<font face="宋體" lang="ZH-CN">與</font>FileSeek<font
face="宋體" lang="ZH-CN">的區(qū)別是:</font>1. Seek<font face="宋體" lang="ZH-CN">僅用于記錄文件;</font>2.
FileSeek<font face="宋體" lang="ZH-CN">的參數(shù)是文件句柄、偏移量、起始位置。其中起始位置有文件首、當(dāng)前位置、文件尾三種選擇。</font>Seek<font
face="宋體" lang="ZH-CN">的參數(shù)是文件變量、偏移量,偏移量是從文件首開(kāi)始定位的。</font>3.
FileSeek<font face="宋體" lang="ZH-CN">的偏移量以字節(jié)數(shù)來(lái)計(jì)算,而</font>Seek<font
face="宋體" lang="ZH-CN">是根據(jù)記錄號(hào)進(jìn)行移動(dòng)。</font> </p>
<p> Seek<font face="宋體" lang="ZH-CN">、</font>FilePos<font
face="宋體" lang="ZH-CN">僅用于記錄文件。但任何文件都可以看作是基于字節(jié)的記錄文件。下面一段程序表示了它們的用法。</font></p>
<p>{ <font face="宋體" lang="ZH-CN">該例子的設(shè)計(jì)界面為一個(gè)包含</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">文件刪除與截?cái)唷?lt;/p>
</font><p>Erase <font face="宋體" lang="ZH-CN">: 刪除一個(gè)存在的文件</p>
</font><p>DeleteFile <font face="宋體" lang="ZH-CN">: 刪除一個(gè)文件</p>
</font><p>Truncate <font face="宋體" lang="ZH-CN">:
從文件當(dāng)前位置將文件截?cái)唷?lt;/p>
</font><p> Erase<font face="宋體"
lang="ZH-CN">與</font>DeleteFile<font face="宋體" lang="ZH-CN">的區(qū)別是:</font>Erase<font
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -