第 11章 磁盘文件存取技术
11.1 有关概念
11.2 磁盘文件管理系统功能调用
11.1 扩展磁盘文件管理有关概念
DOS提供的磁盘管理功能包括三个方面:
一是关于文件内部所存放的数据,比如建立、读、写等二是针对文件的外部属性,如查找文件的名称、日期三是目录管理的创建、删除功能等
1,ASCIIZ串
ASCIIZ串 —对文件进行说明 。 ASCIIZ串最后一个字节为 0,其余字节是指示文件位置的 ASCII码字符串 。
[d:][path]filename.ext,00
用变量定义的形式就写作:
filename DB 'C:\SAMPLE.TXT',00
2,文件代号文件建立或打开后,DOS在自已的保留区建立一个有关文件名,存放盘,路径及读写位置指针等信息的控制块,而返回给用户的是一个 16位的二进制控制字,称为文件代号 。
用这个上文件代号可以方便的访问相应的文件 。
DOS已经预定义了文件代号 0到 4与标准输入输出设备对应,即
0 ── 标准输入设备,键盘;
1 ── 标准输出设备,屏幕;
2 ── 错误输出的标准设备,屏幕;
3 ── 标准辅助设备 ( 通信端口 ) ;
4 ── 标准打印设备 。
这 5个文件代号长期处于打开状态,应用程序可以直接使用 。
3、错误返回码
0,操作成功
CF=
1,操作失败错误类型码保存在 AX寄存器中( 如图 )
4、文件属性 — 有一个字节表示只读隐藏系统卷标子目录归档
7 6 5 4 3 2 1 0 位号:
代码 (Hex) 错 误 原 因 代码 (Hex) 错 误 原 因
0001 非法功能号 0008 内存不够
0002 文件未找到 000C 非法存取代码
0003 路径未找到 000D 非法数据
0004 同时打开的文件太多 0010 试图删除当前目录
0005 拒绝访问 0011 设备不一致
0006 非法文件代号文件操作的错误 代码子功能号
(AH) 功 能 入 口 参 数 出 口 参 数
3CH 创建 DS:DX = 文件名首字符逻辑地址CX = 文件属性 AX = 文件代号
3DH 打开 DS:DX = 文件名首字符逻辑地址AL = 存取代码 AX = 文件代号
3EH 关闭 BX = 文件代号
3FH 读
DS:DX = 数据缓冲区逻辑地址
BX = 文件代号
CX = 读取的字节数
AX = 实际读取的字节数
40H 读
DS:DX = 数据缓冲区逻辑地址
BX = 文件代号
CX = 写入的字节数
AX = 实际写入的字节数
42H 移动指针
(CX,DX) = 移动字节数,有符号双字 AL = 方式码
BX = 文件代号
(DX,AX) = 新的指针位置
11.2 常用扩展磁盘文件管理系统功能调用( 21H)
【 例 11.1】 从键盘读入一个符号串作为文件名,如果文件存在,则显示其中的内容 。
【 解 】
data SEGMENT
str1 DB 'Input File Name,$'
str2 DB 13,10,'File not found,',13,10,'$'
fn DB 80,81 dup(0)
handle DW 0
buf DB 10000 DUP(0)
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
main,MOV AX,data
MOV DS,AX
LEA DX,str1
MOV AH,9
INT 21H ;先显示出提示信息 Input File Name,
INC AH
LEA DX,fn
INT 21H ;以 DOS的 10号子功能读入字符串,作为文件名
MOV BL,[fn+1]
XOR BH,BH
MOV [fn+BX+2],0 ;置文件名字符串的结束标记
LEA DX,[fn+2]
MOV AX,3D00H
INT 21H ;打开文件
JNC opened ;打开成功转
MOV AH,9
LEA DX,str2
INT 21H ;提示 File not found.
JMP finish
opened,MOV [handle],AX ;保存文件代号到变量 handle中
next,MOV BX,[handle] ;取文件代号
MOV AH,3FH
LEA DX,buf
MOV CX,10000
INT 21H ;读 10000个字符,若不足则按实际情况读入
MOV CX,AX ;实际读入字符数
MOV AH,40H
MOV BX,1
INT 21H ;向 1号文件 (标准输出设备,屏幕 )输出
CMP CX,10000
JE next ;读满缓冲区,而文件可能未读完,转
MOV BX,[handle]
MOV AH,3EH
INT 21H ;关闭文件
finish,MOV AH,4CH
INT 21H
RET
code ENDS
END main
【 例 11.2】 给定如下条件:
( 1) 文件 student.dbf中存放着 1000个学生的信息,每条信息占用 40个字节的存储空间,依次存放 1个字型的学号,8
个字符构成的字符串作为姓名,30个字符构成的字符串作为家庭住址 。
( 2) 子程序 lookup能够完成查找索引的功能 。 调用前以入口参数 AX中存放学号,调用后若该学号存在,CF会置 0,
且 (CX,DX)存放该学号在主文件中的地址 (即文件指针 ),学号不存在则 CF为 1。
( 3) 文件 student.dbf已经打开,文件代号存放在变量
handle中 。
( 4) 变量 buf已在数据段中定义,用于存放读入的一个学生的信息 。
要求:编写一个子程序 search,入口参数是在 AX中存放的正整数作为学号。若该学号存在,把 CF置 0,并读出该学生有关信息,送到变量 buf中,否则把 CF置 1。
【 解 】 子程序的功能,入口参数及出口参数都很明确,子程序清单如下:
search PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH DS
CALL lookup ;调用已给出的子程序,在索引中查找
JC error ;找不到转,找到时 (CX,DX)值刚好作为移动文件指针的入口参数
MOV BX,[handle] ;取文件代号
MOV AX,4200H
INT 21H ;移动指针到正确位置
JC error ;文件操作出错转
MOV AX,SEG buf
MOV DS,AX
MOV AH,3FH
LEA DX,buf ;DS:DX为读盘缓冲区首地址
MOV CX,40 ;读取的字节数
INT 21H
error,POP DS
POP DX
POP CX
POP BX
RET
search ENDP
11.3 有关文件外部特性与目录的操作子功能号
(AH) 功 能 入 口 参 数 出 口 参 数
39H 建立子目录 DS:DX=路径字符串首地址
3AH 删除子目录 DS:DX=路径字符串首地址
3BH 改变当前目录 DS:DX=路径字符串首地址
41H 删除文件
DS:DX=待删除文件名字符串首地址
43H 置 /取文件属性
DS:DX=文件名字符串首地址
AL=0取文件属性
AL=1置文件属性
CX=文件属性取文件属性成功时,
CX=文件属性
47H 取当前目录路径 DL=驱动器号DS:SI=65字节的数据缓冲区成功时,缓冲区中被 填 写 当 前 目 录
(含路径 )字符串
57H 置 /取文件日期和时间
BX=文件代号
AL=0取文件的日期和时间
AL=1置文件的日期和时间
CX=时间,DX=日期取日期和时间成功时,CX= 时间,
DX=日期