?? page210.html
字號:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第8章 文件句柄功能與磁盤</title>
</head>
<body>
<style type="text/css">
body {
background-color: #c0c0c0;
}
table {
background-color: #c0c0c0;
line-height: 24px;
}
</style>
<!導航條>
<p><a href="content1.html">目錄</a> <a href="page209.html">上一頁</a> <a href="page211.html">下一頁</a> <a href="page238.html">下一章</a></p>
<table border=0 align="center" width=800 frame="box" rules="none">
<!標尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td>
</tr>
<!頁眉行>
<tr height=60 valign="bottom">
<td></td><td>-208-</td><td></td> <!頁碼>
<td colspan=6>PC機匯編語言實戰精解</td><td colspan=4></td><td colspan=6 align="right"><img src="icons/flag.gif"></td> <!書名>
<td></td><td></td><td></td> <!右側空白>
</tr>
<!頁眉線>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋體" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!頂部空白>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
0,1,2的數據,分別表示"讀"、"寫"和"讀/寫"三種方式。如果大家熟悉C語言,肯定知道用FOPEN函數打開文件時也要指明存取方式:r表示"讀取";rw表示"讀/寫"。如果大家不清楚C語言為什么要有這樣的要求,那么學到這里,我想你應該對這個問題有了比較明白的認識--C語言也要求助于DOS為其打開文件,它也要遵守DOS的規定。<br>
事實上DOS允許我們同時打開多個文件,每打開一個文件DOS都會給我們返回一個句柄,各個文件對應的句柄都是不同的。我們知道每打開一個文件后DOS都會取得與這個文件相關的一些特征信息保存在自己內部,而DOS用于保存這些信息的空間可不是無窮無盡的,所以能夠同時打開的文件數就有限制。DOS啟動后究竟為打開文件準備了多少內存呢?這個問題的答案在CONFIG.SYS文件中。還記得我們前面討論的BUFFERS設置嗎?在CONFIG文件中還有一項"FILES=???"的配置項,這一項就是告訴DOS啟動時要準備出打開"???"個文件所需的內存空間。而我們的程序所能同時打開的文件個數是"???-5"個,這是因為文件句柄號是從05H開始的。<br>
在本節的最后,我們來討論一下有關"建立文件"的內容。下面給出了3CH功能的用法,利用句柄功能建立一個文件和用FCB功能并無太大區別,要注意的有這樣幾點:<br>
<font face="楷體_GB2312">
第一,不要忘記用ASCIIZ串給出路徑和文件名;<br>
第二,如果指定目錄下無重名的目錄項,則DOS會新建一個目錄項并返回句柄。如果指定目錄下有一個與待建立的文件重名的目錄項,則DOS會將舊的文件長度截為0。此一點和FCB功能相同。<br>
第三,CX寄存器中要設定待建文件的屬性。屬性的定義和FCB功能相同,但是句柄功能無法建立具有卷標屬性或子目錄屬性的目錄項。同FCB功能相比這可以說是句柄功能的一個弱項。<br>
第四,若出錯,則CF標志置位,同時AX寄存器返回錯誤碼供程序處理。這其實是所有句柄功能的一個共同特點。這些錯誤代碼都出自一個統一的錯誤代碼表,見表7-2。<br>
第五,文件成功建立之后我們即可對其進行寫操作,3CH功能不涉及"打開方式"的問題。建立文件功能的用法并不難,大家可自己編制實驗程序將其掌握。
</font>
</td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18 align=center><font face="楷體_GB2312">表7-2 錯誤代碼表</font></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>01</td><td colspan=4>非法功能號</td><td colspan=2>10</td><td colspan=4>非法環境</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>02</td><td colspan=4>文件未找到</td><td colspan=2>11</td><td colspan=4>非法格式</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>03</td><td colspan=4>路徑名不正確</td><td colspan=2>12</td><td colspan=4>非法存取代碼</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>04</td><td colspan=4>同時打開的文件太多</td><td colspan=2>13</td><td colspan=4>非法數據</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>05</td><td colspan=4>拒絕存取</td><td colspan=2>14</td><td colspan=4>未定義</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>06</td><td colspan=4>非法文件句柄</td><td colspan=2>15</td><td colspan=4>非法指定設備</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>07</td><td colspan=4>內存控制塊被破壞</td><td colspan=2>16</td><td colspan=4>試圖刪除當前的目錄</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>08</td><td colspan=4>內存不夠</td><td colspan=2>17</td><td colspan=4>設備不一致</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=3></td><td colspan=2>09</td><td colspan=4>非法存儲塊地址</td><td colspan=2>18</td><td colspan=4>已沒有文件</td><td colspan=3></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18><font face="黑體"><a name="811">8.1.1 文件的存取</a></font></td>
<td></td><td></td> <!右邊距>
</tr>
<tr>
<td></td><td></td> <!左邊距>
<td colspan=18>
一個文件正常打開(或建立)之后,我們下面對文件進行存取的時候就不再依靠那個ASCIIZ串了,而完全依靠DOS給我們的文件句柄。這可以從表--中所列的讀寫功能的用法中看出一些眉目來。下面我們就來看一看文件的讀寫功能是如何應用的。請看程序STARMAP.ASM:
</td>
<td></td><td></td> <!右邊距>
</tr>
</font>
<!頁腳線>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!頁腳>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright © 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!導航條>
<p align="right"><a href="content1.html">目錄</a> <a href="page209.html">上一頁</a> <a href="page211.html">下一頁</a> <a href="page238.html">下一章</a></p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -