100 CHƯƠNG 15 : CÁCCHỨCNĂNGVỀ FILE VÀTHƯMỤC CỦA HỆĐIỀUHÀNHDOSCácchứcnăng cơ bản của hệđiềuhànhDOS đều tập trung vào Interrupt 21h. Số hiệu củachứcnăng được đặt trong thanh ghi AH,các tham số được đặt trong các thanh ghi còn lại. Các chuỗi được sử dụng trong interrupt 21h thường là các dãy ASCIIZ (các dãy ký tự kết thúc bằng mã 0). Khi chứcnăng thực hiện gặp lỗi, cờ hiệu CF được dựng lên và mã lỗi thường được đặt trong AX. Để truy nhập thông tin trong một file cần phải có các thông số như : - Tên file. - Vò trí lưu chứa directory entry. - Các cluster lưu chứa thông tin của file. - Kích thước file hiện hành. - Vò trí của con trỏ file. - Các thông số này được đặt trong một cấu trúc đặc biệt gọi là FCB (File Control Block) . Cácchứcnăngvềfile sẽ dựa theo thông tin trong FCB để thực hiện. Mỗi file được điều khiển bởi một FCB. Trước khi file được truy nhập, FCB tương ứng với nó phải được chuẩn bò các thông số cơ bản (thông thường đó là các thông tin chứa trong directory entry tương ứng với file). Việc thiết lập các thông số ban đầu cho một FCB được gọi là tác vụ mở file (open file). Thông thường thì các chương trình ứng dụng chỉ cần chỉ ra một FCB đã có chứa sẵn tên filevà yêu cầu hệđiềuhành “mở file”. Hệđiềuhành sẽ tìm kiếm và điền đầy đủ các thông tin còn lại vào FCB ấy. Sau đó, mỗi lần cần truy nhập file, chương trình ứng dụng sẽ gọi đến chứcnăng tương ứng củahệđiềuhành đính kèm với đòa chỉ của FCB. Các chương trình ứng dụng phải tự mình tạo ra và quản lý các FCB. Điều này không được thuận tiện cho lắm khi phát triển các version mới củahệđiềuhành : cấu trúc của FCB là bất biến. Để khắc phục vấn đề này, một cung cách tổ chức ở mức cao hơn được đưa ra : hệđiềuhành tạo ra một cấu trúc tương tự như một mảng các FCB trong vùng nhớ riêng của nó. Khi chương trình ứng dụng cần mở một file, chỉ cần gọi chứcnăng mở filecủahệđiềuhành cùng với tên của file. Hệđiềuhành sẽ tự động cấp phát một FCB còn trống, điền các thông số cần thiết vào đó và trả lại cho chương trình ứng dụng số hiệu của FCB đó (gọi là file handle number). Các tác vụ trên file kế tiếp chỉ cần đính kèm với số hiệu tương ứng của file. Mặt khác, ý niệm vềfile handle đã được mở rộng ra nhiều so với FCB. DOS quan niệm file handle là một đầu mối có thể cung cấp hoặc tiếp nhận thông in theo một số cung cách nhất đònh tùy theo thuộc tính của từng file handle. Theo đó file handle không chỉ quản lý cácfile trên đóa, mà còn có thể đại diện cho các thiết bò khác. Thí dụ : Bàn phím là một nguồn cung cấp dữ liệu một cách tuần tự. (Tương đương với một file mở ở mode read only) Máy in là một nơi tiếp nhận dữ liệu một cách tuần tự. (Tương đương với một file mở ở mode write only) Mặc dù hệđiềuhànhDOS cung cấp cả hai cung cách truy nhập file (theo FCB và theo file handle ), nhưng cácchứcnăng dùng trực tiếp FCB chỉ nhằm tương thích với các version đầu tiên củaDOS mà thôi. Trong tài liệu này, húng ta sẽ chỉ đề cập đến cácchứcnăng dùng file handle. 15.1CÁC CHỨCNĂNGVỀFILE 15.1.1Tạo lập file (Create) 101 Input : AH = 3Ch CX = File attribute DS:DX = ỴBuffer chứa file name (ASCIIZ) Output : CF = 1 --> AX = error code CF = 0 --> AX = file handle number (file tự động được mở với mode đọc/ghi) 15.1.2Mở file (Open) Input : AH = 3Dh AL = 0 --> mode read only = 1 --> mode write only = 2 --> mode read/write DS:DX = ỴBuffer chứa file name (ASCIIZ) Output : CF = 1 --> AX = error code CF = 0 --> AX = file handle number 15.1.3Đóng file (Close) Input : AH = 3Eh BX = File handle Output : CF = 1 --> AX = error code 15.1.4Đặt con trỏ file (Set file pointer) Input : AH = 42h AL = mode BX = File handle CX:DX = số gia (DWORD) AL = 0 --> file pointer := CX:DX AL = 1 --> file pointer := CX:DX + file pointer AL = 1 --> file pointer := CX:DX + file size Output : CF = 1 --> AX = error code CF = 0 --> DX:AX = gia trò mới củafile pointer 15.1.5Đọc file (Read) Input : AH = 3Fh BX = File handle CX = Số byte đọc DS:DX = ỴBuffer Output : CF = 1 --> AX = error code CF = 0 --> AX = số byte thực sự được đọc Dữ liệu bắt đầu từ vò trí hiện hànhcủafile pointer được đọc vào buffer. Không thể đọc vượt quá vò trí cuối file. 15.1.6Ghi file (Write) Input : AH = 40h BX = File handle CX = Số byte ghi 102 DS:DX = ỴBuffer Output : CF = 1 --> AX = error code Dữ liệu trong buffer được ghi xuống file bắt đầu từ vò trí hiện hànhcủafile pointer. Nếu gặp vò trí cuối file, kích thước file sẽ được mở rộng ra theo số byte ghi thêm. Nếu CX = 0 --> kích thước file sẽ được gán bằng giá trò củafile pointer hiện hành. Trong trường hợp này file có thể bò cắt ngắn đi hoặc mở rộng ra tùy theo vò trí củafile pointer . 15.1.7Hủy bỏ file (Delete) Input : AH = 41h DS:DX = ỴBuffer chứa file name (ASCIIZ) (File name có thể bao gồm đầy đủ tên ổ đóa và PATH) Output : CF = 1 --> AX = error code 15.1.8Xem/sửa file attrib Input : AH = 43h AL = 0 --> lấy file attrib = 1 --> đặt file attrib mới CX = Attribute mới (AL=1) DS:DX = ỴBuffer chứa file name (ASCIIZ) Output : CF = 1 --> AX = error code CF = 0 --> CX = file Attribute (AL=0) 15.2CÁC CHỨCNĂNGVỀTHƯMỤC 15.2.1Tạo thưmục Input : AH = 39h DS:DX = ỴBuffer chứa directory name (ASCIIZ) 15.2.2Xóa thưmục Input : AH = 3Ah DS:DX = ỴBuffer chứa directory name (ASCIIZ) 15.2.3Chỉ đònh thưmục hiện hành Input : AH = 3Bh DS:DX = ỴBuffer chứa directory name (ASCIIZ) 15.2.4Lấy tên thưmục hiện hành Input : AH = 47h DL = driver code ( 0=default,1=A,2=B,3=C .) DS:SI = Address of 64 bytes buffer Path name trả lại không bắt đầu bằng tên ổ đóa lẫn dấu ‘\’ và kết thúc bằng mã 0h 15.2.5Tìm directory entry đầu tiên trong thưmục Input : AH = 4Eh CX = search attribute DS:DX = ỴBuffer chứa search name (ASCIIZ) 103 search name có thể chỉ đònh bằng các ký hiệu ‘?’ hay ‘*’. Nếu tìm thấy, các thông tin của phần tử này được đặt trong DTA 15.2.6Tìm directory entry kế tiếp trong thưmục Input : AH = 4Fh DOS sử dụng các thông tin cung cấp bởi lời gọi chứcnăng 04E trước đó ( lưu giữ trong DTA từ byte 0 -> 14 ) để tìm phần tử kế tiếp . Nếu tìm thấy, các thông tin của phần tử này được đặt trong DTA 15.2.7Cấu trúc DTA (Disk transfer area) 00 -> 14 : Vùng dành riêng củaDOS 15 : File attribute 16 -> 17 : File time 18 -> 19 : File date 1A -> 1D : File size 1E -> 2A : File name ( Kết thúc bằng mã 0h ) Thông thường khi chương trình vừa được gọi thực hiện DTA được đặt tại offset 080h của PSP . Đối với file dạng COM, đòa chỉ này là CS:080 Lấy đòa chỉ DTA : Input : AH = 02Fh Output: ES:BX = segment:offset of DTA Đònh đòa chỉ DTA : Input : AH = 01Ah DS:DX = segment:offset of DTA 15.2.8Duyệt cây thưmục Ta có thể sử dụng hai chứcnăng 4Eh và 4Fh để hiển thò tất cả cácfile có tên trùng với Search— name trên toàn đóa theo giải thuật sau: Search—path : là path dò tìm hiện tại Search—name : tên của phần tử cần tìm (có thể bao gồm ? và * ) 1.Tạo Search—path bắt đầu từ thưmục chủ (Root) <Driver—name>:\ ; Thí dụ A:\ 2.Tìm tất cả cácfile theo Search—name bằng cách : Gọi chứcnăng 04Eh với CX = 012h DS:DX = segment:offset of Search—path+Search—name Hiển thò tên file vừa tìm thấy Gọi chứcnăng 04Fh cho đến khi hết tìm thấy . 3.Tìm thưmục đầu tiên trong Search—path bằng cách gọi chứcchứcnăng 04Eh với CX = 012h ( Tìm cả những thưmục “dấu mặt” ) DS:DX = segment:offset of Search—path+’\*.*’ Nếu không tìm thấy : 3.1 Nếu Search—path đang chỉ vào thưmục chủ thì kết thúc Nếu Search—path đang chỉ vào một thưmục con thì : 3a. Bỏ tên thưmục cuối cùng trong Search—path và trả lại DTA trước đó 104 3b. Tìm tên thưmục kế tiếp bằng chứcnăng 04Fh ( Tìm theo thông tin của DTA vừa lấy lại ) Nếu không tìm thấy lặp lại bước 3.1 Nếu tìm thấy, tiếp tục bước 4 4.Thêm tên thưmục mới tìm thấy vào Search—path Hiển thò Search—path mới 5.Lưu DTA hiện tại và tạo DTA mới với Search—path mới 6.Lặp lại bước 2 15.3CÁC MÃ LỖI THƯỜNG GẶP CỦA INTERRUPT 021H : Hex Dec Meaning --- --- ----------------------- 1 1 Invalid function number 2 2 File not found 3 3 Path not found 4 4 Too many open files 5 5 Access denied 6 6 Invalid handle 7 7 Memory ctrl blocks destroyed 8 8 Insufficient memory 9 9 Invalid memory block address 0aH 10 Invalid environment 0bH 11 Invalid format 0cH 12 Invalid access code 0dH 13 Invalid data 0eH 14 (not used) 0fH 15 Invalid drive specified 10H 16 Can’t remove current directory 11H 17 Not same device 12H 18 No more matching files . : CÁC CHỨC NĂNG VỀ FILE VÀ THƯ MỤC CỦA HỆ ĐIỀU HÀNH DOS Các chức năng cơ bản của hệ điều hành DOS đều tập trung vào Interrupt 21h. Số hiệu của chức năng. các FCB trong vùng nhớ riêng của nó. Khi chương trình ứng dụng cần mở một file, chỉ cần gọi chức năng mở file của hệ điều hành cùng với tên của file. Hệ