100
CHƯƠNG 15 :
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 đặ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ức nă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ác chức
năng về 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 file và yêu cầu hệ điều hành “mở file”. Hệ điều hà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ức năng tương ứng của hệ điều hà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ủa hệ điều hà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ều hà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ức năng mở file của hệ điều hành
cùng với tên của file. Hệ điều hà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
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ủa file 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ành của file 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ành của file 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.
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ức nă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ủa DOS
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ức năng 4Eh và 4Fh để hiển thò tất cả các file có tên trùng với Search—
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