3.3.3文件管理的有關數據結構

如前所述,DOS支持兩類文件服務功能:一類是最初版本(DOS1.X)提供的傳統文件控製塊功能,另一類是升級版本(DOS2.X及以上版本)提供的句柄文件控製塊功能。在應用程序對磁盤文件進行操作時,若使用第一類功能,則必須在程序數據區內設置一個符合係統規定的文件控製塊FCB,借助FCB這個接口實現應用程序與DOS內核對磁盤文件的信息傳遞。由於FCB的結構十分複雜(占37個字節),給程序員帶來編程的難度,所以,DOS2.00開始將這個繁瑣的FCB在係統啟動期間挪到了係統內部,這樣,在應用程序使用第二類功能訪問磁盤文件時,隻需給出該文件名的字符串。當該字符串被內核確認後,DOS返回一個句柄值(一字長的整數),意味著該文件已被打開。在隨後的任何時候,隻要使用這個句柄,即可對該文件進行讀寫等操作。

由應用程序設置的FCB稱為傳統文件控製塊,由DOS設置的FCB稱為句柄文件控製塊,簡稱HFCB,它們組成係統文件表(SFT)。SFT位DOS係統區內,在係統啟動的過程中初始化,其個數由CONFIG.SYS文件中的“FILES=”項設定,缺省值為8,最大值為255。下麵將討論兩種FCB的結構。由於傳統文件操作行將淘汰,故在此以討論HFCB及其相關的操作為主。

1.傳統文件控製塊的結構

從文件控製塊的結構可看到,FCB有普通的FCB和擴展的FCB之分。前者用於普通文件(即文件屬性字節值為20H)的所有操作,後者用於特殊文件(包括子目錄、卷標)的操作。兩者的區別僅在普通的FCB前麵增設六個字節的擴展標誌,後接一個字節的文件屬性。使用時,任何普通FCB的DOS功能同樣適合擴展的FCB。

不論普通的FCB還是擴展的FCB,都存在兩種不同的狀態:未打開的和打開的。

所謂未打開的FCB,是指程序要建立一個新文件或打開、刪除一個已存文件或查找目錄登記項之前,在09H—0BH的位移處分別填入指定的驅動器名、文件名和擴展名,並用雙字指針DS:DX所指向的FCB結構。

所謂打開的FCB,是DOS在完成了新文件的建立或已存文件打開操作之後,在0CH-1FH的位移處分別填入了當前記錄塊號、記錄長度、文件長度和文件建立或最後修改的日期、時間等信息的FCB(這些信息來自相應文件的目錄登記項)。應用程序和DOS依據打開的FCB所輯供的信息才能完成對指定文件的各種操作。

FCB文件操作方式是以記錄為單位進行文件讀寫的。應用程序對文件的讀寫方式不同,在打開的FCB中填入的記錄定位值不同。在順序讀寫時,應用程序將當前記錄塊號和當前記錄號分別填入位移0CH和20H處;而在隨機讀寫時,應用程序卻隻需將相對記錄號置於位移邳H處。當然,不論哪種存取方式,DOS都允許應用程序指定一條記錄的字節長度,即把選定值填入FCB中位移0EH處。

2.句柄文件控製塊的結構

句柄文件控製塊的結構在DOS2.X和DOS3.X環境下,其布局有較大的差別。DOS2.X版本設計的句柄文件控製塊僅僅是在傳統的37字節FCB前增加3字節。這樣做的原因是:當DOS由最初版本升級至1.X版本時,因傳統文件控製塊功能應用普遍以及技術的成熟性,使內核增添的句柄文件控製塊功能在設計上沿襲了傳統的風格,即內核在處理句柄文件控製塊的各種功能調用時,最終仍要調用傳統文件控製塊功能來完成具體的文件操作。為此句柄文件功能所使用的FCB當然要保持傳統FCB原有的結構,所增加的3個字節隻是用於內核對句柄FCB的管理而已。

DOS3.00版本以後句柄方式的文件功能的係統服務程序具有一定的獨立性.不再同傳統FCB方式共用下層模塊。為此,句柄文件控製塊的結構布局也作了較大的改進:與句柄文件存取無關的記錄塊、塊內記錄號、記錄長度及隨機記錄號等字段一律取消,並為支持網絡環境下文件操作保留了較大的空間。

句柄文件控製塊各字段的含義及用途:

(1)使用計數該域指示本句柄FCB的使用次數。此域為0表示空閑可分配的FCB。每當為一個允許建立或允許打開的文件分配使用時,該域值加1,而當文件被關閉時,該域值減1。另外,一個父進程加載另一個子進程時,子進程將繼承父進程所有打開的文件句柄,此時,本域值也被加1。同樣,當子進程執行完畢返回父進程後,該域值又被減1。

(2)存取方式該域指示對一個正打開文件存取的方式。

(3)文件屬性該域指示一個已打開文件的屬性。

(4)設備信息字節該域指示與之關聯的是磁盤文件或是字符設備文件。

(5)驅動器號該域以表示各驅動器。

(6)字符設備驅動程序域UPB地址該域以段:基址形式指出字符設備驅動程序的地址,或指出部件參數塊UPB地址。

(7)文件首簇號該域取自一個已打開文件在目錄登記項中的首簇號,用於文件的存取。

(8)文件建立日期/時間這兩個域均取自一個已打開文件在目錄登記項中的相應字段。

(9)文件長度該域也取自一個已打開文件在目錄登記項中的文件長度字段,即文件尾指針位置。

(10)文件當前指針位置該域值為0,表示指向文件頭。隨文件存取時指定字節位置的變化而記載著當前指針的位置。

(11)已完成簇數該域表示文件存取已完成的簇數,在文件存取前初值為0。

(12)文件當前指針處簇誇該域在文件存取前,初值即是文件首簇號,隨著文件指針在讀寫過程中變動,其域值也相應變動。

(13)文件名和擴展名該域與一個已打開文件在目錄登記項中的相應字段值是一致的。

3.係統打開文件表

句柄實際上是一個16位長度的二進製代碼,它代表一個已被打開的文件的內部編號,借助於句柄,應用程序與DGS內核間對某個特定文件取得一致。換而言之,文件一旦被DOS打開,應用程序隻需憑借由DOS返回的句柄可對相應的文件進行隨意存取。事實上句柄和打#的文件可以是多對一的關係,即一個句柄對應一個打開文件或者多個句柄對應一個打開的文件。

為有效地處理句柄與打開文件的關係,DOS在每個進程的PSP(見程序管理)中設置了一張係統打開文件表。SOFT占20字節,每個表項占一個字節,表項位移(自0至19,十進製),即是句柄號。其字節內容指出所對應的句柄FCB號,若此值為FFH,則表示該句柄為自由句柄可供分配。每次分配句柄時,總是從句柄0開始掃描,直至找到其字節值為-1的自由句柄,把它分配給一個已打開的文件。如果從上而下找不到自由句柄,則意味著同時打開的文件已達到限額,DOS會返回錯誤信息。但是,找到的自由句柄是否可與待打開的文件建立對應關係,尚要取決於係統文件表SFT中是否存在空閑的文件控製塊。如果存在,則該空閑的FCB號填入SOFT的自由句柄字節內,否則,文件打開失敗。

由上可見,DOS通過係統打開文件表實現句柄和句柄FCB以及打開文件的對應關係。實現過程可歸納為以下三步:

(1)在當前程序的係統打開文件表中尋找一個值為-1的表項,若找到則把表項號保存,否則出錯返回;

(2)在係統文件表SFT中尋找“使用計數”域為0的句柄文件控製塊,若找到,保存句柄FCB號,及該FCB的雙字地址,否則出錯返回;

(3)若在目錄表中找到與待打開的文件名匹配的項,則把該文件目錄登記項中的有關域填入句柄FCB的有關字段,再將上述第二步得到的句柄FCB號填入第一步確定的句柄號單元中,到此句柄與句FCB的對應關係完全建立。

3.3.4句柄管理策略

句柄是以文件句柄方式進行文件操作的基本參數,但DOS中q每個應用程序使用的句柄及相應的句柄FCB有一定的數量限製。DOS內核所提供的係統服務中,與句柄有關的子功能大致有如下幾類:建立文件;打開文件(3DH);關閉文件(3EH);存取文件(3FH,40H);取/置文件日期和時間(57H);設備驅動控製(44H);網絡文件共享或鎖定(5CH);句柄複製或強迫複製(45H,46H);設置擴展句柄的數量(67H);對提交文件的快速寫盤(68H);進程的加載和結束處理(4BH,22H)。這些功能大都涉及到一個或兩個句柄和相應的打開文件。為了充分利用少數的句柄提供給多個文件使用,DOS對句柄及相應的FCB有一套完整的管理辦法。這方麵的知識在上一小節中已涉及不少,在此再作歸納、補充。