第六章磁盘文件存取实验(设计性实验)一、实验要求和目的1.理解文件、目录的概念;2.了解FCB(文件控制块)方式文件管理方法;3.掌握文件代号式文件存取方式;4.学习使用文件指针读取文件二、软硬件环境1.硬件环境:计算机系统windows;2.软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识单元DOS功能调用中断(INT 21H)提供了两类磁盘文件管理功能,一类是FCB(文件控制块)方式,另一类是文件代号式存取方式。
对于文件的管理,实际上是对文件的读写管理,DOS 设计了四种存取文件方式:顺序存取方式、随机存取方式、随机分块存取方式和代号法存取方式。
文件的处理步骤A)写之前必须先建立文件、读之前必须先打开文件。
B)写文件之后一定要关闭文件。
通过关闭文件,使操作系统确认此文件放在磁盘哪一部分,写后不关闭会导致写入文件不完整。
1、文件代号式存取方式:当用户需要打开或建立一个文件时,必须提供文件标识符。
文件标识符用ASCII Z 字符串表示。
ASCII Z 字符串是指文件标识符的ASCII 字符串后面再加1 个“0”字符。
文件标识符的字符串包括驱动器名、路径名和文件名。
其格式为[d:][path]filename[.exe]其中d 为驱动器名,path 为路径名,.exe 为文件名后缀。
中断 21H 提供了许多有关目录和文件操作的功能,其中文件代号式存取方式常用的功能如下:2、操作目录的常用功能39H——创建目录 3BH——设置当前目录3AH——删除目录 47H——读取当前目录有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅相关资料之目录控制功能。
3、用文件句柄操作文件的常用功能3CH——创建文件 4EH——查找到第一个文件3DH——打开文件 4FH——查找下一个文件3EH——关闭文件 56H——文件换名3FH——读文件或设备 57H——读取/设置文件的日期和时间40H——写文件或设备 5AH——创建临时文件41H——删除文件 5BH——创建新文件42H——设置文件指针 67H——设置文件句柄数(最多文件数)43H——读取/设置文件属性 6CH——扩展的打开文件功能有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅相关资料之文件操作功能。
下面简单介绍几种常用的功能:(1).建立文件(3CH)功能:按指定文件名建立文件。
入口参数:(AH)=3CH,DS:DX 指向ASCII Z 字符串的段地址和偏移地址,(CX)=文件属性。
出口参数:若操作成功,则CF=0,(AX)=文件代号;若操作失败,则CF=1,(AX)=错误代码。
(2).打开文件(3DH)功能:打开由ASCII Z 串指定的文件。
入口参数:(AH)=3DH,DS:DX 指向ASCII Z 字符串的段地址和偏移地址,(AL)=存取方式代码(0:读文件,1:写文件,2:读、写文件)。
出口参数:若操作成功,则CF=0,(AX)=文件代号;若操作失败,则CF=1,(AX)=错误代码。
(3).关闭文件(3EH)功能:关闭文件代号指定的文件。
入口参数:(AH)=3EH,(BX)=文件代号。
出口参数:若操作成功,则CF=0;若操作失败,则CF=1,(AX)=错误代码。
(4).读文件(3FH)功能:按文件代号读取文件。
入口参数:(AH)=3FH,(BX)=文件代号,(CX)=要读取的字节数;DS:DX 指向接收数据缓冲区的段地址和偏移地址。
出口参数:若操作成功,则CF=0,(AX)=实际读入字节数,(AX)=0,文件结束;若操作失败,则CF=1,(AX)=错误代码。
(5).写文件(40H)功能:按文件代号写文件。
入口参数:(AH)=40H,(BX)=文件代号,(CX)=要写入的字节数;DS:DX 指向存放写入信息数据缓冲区的段地址和偏移地址。
出口参数:若操作成功,则CF=0,(AX)=写入字节数;若操作失败,则CF=1,(AX)=错误代码。
(6).移动文件指针(42H)功能:移动由文件代号标志的文件读写指针的位置入口参数:在bx 预置文件代号,在cx:dx 双字中预置移动位移量,在 al 中预置移动方式移动方式:00h 移动后文件指针值=0+移动位移量01h 移动后文件指针值=当前文件指针值+移动位移量02h 移动后文件指针值=文件尾值+移动位移量出口参数:CF=0 表示移动成功,此时CX:DX 双字中返回移动后文件指针值;CF=1 表示移动失败,此时AX 中返回值为1 表示移动方式无效,为6 表示无效的文件代号。
(7).取/置文件属性(43H)功能:按文件代号写文件。
入口参数:(AH)=43H,DS:DX 指向ASCII Z 串的段地址和偏移地址。
(AL)=0,取文件属性,(AL)=1,置文件属性;置文件属性时,(CX)=新文件属性(低字节)。
出口参数:若操作成功,则CF=0,若为取属性,(CX)=文件属性;若操作失败,则CF=1,(AX)=错误代码。
用FCB 操作文件的常用功能和磁盘绝对读写中断请参阅相关资料,不作要求。
四、实验内容与步骤(文件代号式存取方式)1、编写一个创建子目录的程序,具体要求如下:1)用键盘输入一个目录路径名,若输入的字符串为空,则程序运行结束;2)若目录创建成功,显示成功信息,否则,显示创建失败信息。
·流程图如下:·源代码如下:data segmenthandle dw ?msg1 db 'Please input the directory route:', 0dh, 0ah, '$'msg2 db 0dh, 0ah, 'Error: create directory failed!', 0dh, 0ah, '$' msg3 db 0dh, 0ah, 'Create directory successful!', 0dh, 0ah, '$' dirn_buf db 64db ?dirn_str db 64 dup(0)data endscode segmentassume cs:code, ds:datastart:mov ax, datamov ds, axlea dx, msg1mov ah, 09hint 21h ;;输出提示信息lea dx, dirn_bufmov ah, 0ahint 21hmov bl, [dirn_buf+1]mov bh, 0mov dirn_str[bx], 0 ;;输入目录路径,将串尾回车更换为00cmp byte ptr [dirn_buf+1], 0jz exit ;;输入为空,直接退出lea dx, dirn_strmov cx, 00hmov ah, 39hint 21h ;;创建目录jc error ;;错误mov handle, ax ;;保存文件代号lea dx, msg3mov ah, 09hint 21h ;;输出成功信息mov bx, handlemov ah, 3ehint 21h ;;关闭文件jmp exiterror:lea dx, msg2 ;;输出错误信息mov ah, 09hint 21hexit:mov ax, 4c00hint 21hcode endsend start此时已经成功在G盘下创建abc文件夹2、编写一个创建文件的程序,其要求如下:1)用键盘输入文件名(可包含路径),若输入的字符串为空,则程序运行结束;2)若目录创建成功,显示成功信息,否则,显示创建失败信息;·流程图如下:data segmenthandle dw ?msg1 db 'Please input the file route:', 0dh, 0ah, '$'msg2 db 0dh, 0ah, 'Error: create file failed!', 0dh, 0ah, '$' msg3 db 0dh, 0ah, 'Create file successful!', 0dh, 0ah, '$' msg4 db 0dh, 0ah, 'Error: write file failed!', 0dh, 0ah, '$' msg5 db 0dh, 0ah, 'Please input 20 characters:', 0dh, 0ah, '$' fn_buf db 64db ?fn_str db 64 dup(0)wf_buf db 64db ?wf_str db 64 dup(0)data endscode segmentassume cs:code, ds:datastart:mov ax, datamov ds, axlea dx, msg1mov ah, 09hint 21h ;;输出提示信息lea dx, fn_bufmov ah, 0ahint 21hmov bl, [fn_buf+1]mov bh, 0mov fn_str[bx], 0 ;;输入文件路径,串尾回车用00代换cmp byte ptr [fn_buf+1], 0jz exit ;;输入为空,直接退出lea dx, fn_strmov cx, 00hmov ah, 3chint 21h ;;创建文件jc error ;;失败,退出mov handle, axlea dx, msg3mov ah, 09hint 21h ;;保存文件代号,输出成功信息lea dx, msg5mov ah, 09hint 21h ;;输出提示信息lea dx, wf_bufmov ah, 0ahint 21h ;;从键盘输入串lea dx, wf_strmov bx, handlemov cl, byte ptr [wf_buf+1]mov ch, 0mov ah, 40hint 21h ;;将串写入到刚创建的文件jc wf_errormov bx, handlemov ah, 3ehint 21h ;;关闭文件jmp exiterror:lea dx, msg2mov ah, 09hint 21hjmp exit ;;创建失败wf_error:lea dx, msg4mov ah, 09hint 21h ;;写文件失败exit:mov ax, 4c00hint 21hcode endsend start·运行结果如下:在磁盘路径下搜索,可以看见如下内容:证明程序代码正确3)从键盘输入20 个字符存放到新建立的文件中。