实验六磁盘文件存取实验(设计性实验)一、实验要求和目的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、编写一个创建子目录的程序,具体要求如下:1)用键盘输入一个目录路径名,若输入的字符串为空,则程序运行结束;2)若目录创建成功,显示成功信息,否则,显示创建失败信息。
程序框图:源程序:DATAS SEGMENTSTRING1 DB 'Input a new path:',0dh,0ah,'$'STRING2 DB 'Create successfully.',0dh,0ah,'$'开始输入新目录路径路径为空将路径改为ASCIIZ 字符串创建新目录CF=0是屏幕显示成功 结束屏幕显示失败否是否STRING3 DB 'Failed.',0dh,0ah,'$'BUF DB 20,?,20 DUP(?) ;路径存储缓冲区DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXLEA DX,STRING1MOV AH,9INT 21HLEA DX,BUF ;输入路径MOV AH,10INT 21HCMP BUF[1],BYTE PTR 0 ;判断路径是否为空JZ FINISHMOV CL,BUF[1]LEA SI,BUF+2ADD SI,CXMOV BYTE PTR [SI], 0 ;将路径转为ASCIIZ字符串CLCMOV AH,39H ;创建目录LEA DX,BUF+2MOV CX,0INT 21HJC L2 ;判断是否成功LEA DX,STRING2MOV AH,9INT 21HJMP FINISHL2: LEA DX,STRING3MOV AH,9INT 21HFINISH:MOV AH,4CHINT 21HCODES ENDSEND START程序结果:2、编写一个创建文件的程序,其要求如下:1)用键盘输入文件名(可包含路径),若输入的字符串为空,则程序运行结束;2)若目录创建成功,显示成功信息,否则,显示创建失败信息;3)从键盘输入20 个字符存放到新建立的文件中。
程序框图:源程序: DATAS SEGMENTSTRING1 DB 'Input a new path:',0dh,0ah,'$' STRING2 DB 'Create successfully.',0dh,0ah,'$' 开始输入新文件路径路径为空将路径改为ASCIIZ 字符串创建新文件CF=0是屏幕显示成功 结束屏幕显示失败否是否输入要写入的内容写入内容STRING3 DB 'Failed.',0dh,0ah,'$'STRING4 DB 'Write successfully.',0dh,0ah,'$'STRING5 DB 'Write new words:',0dh,0ah,'$'STRING6 DB 0dh,0ah,'$'BUF DB 20,?,20 DUP(?) ;路径存储缓冲区WRITE DB 40,?,40 DUP(?) ;写入内容存储缓冲区DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXLEA DX,STRING1MOV AH,9INT 21HLEA DX,BUF ;输入新文件路径MOV AH,10INT 21HLEA DX,STRING6MOV AH,9INT 21HCMP BUF[1],BYTE PTR 0 ;判断是否为空JZ FINISHMOV CL,BUF[1]LEA SI,BUF+2ADD SI,CXMOV BYTE PTR [SI], 0 ;路径改为ASCIIZ字符串CLCMOV AH,3CH ;创建新文件LEA DX,BUF+2MOV CX,0INT 21HJC L2 ;判断是否成功CALL SUCJMP FINISHL2: LEA DX,STRING3MOV AH,9INT 21HFINISH:MOV AH,4CHINT 21H;子函数:正确建立输入内容SUC PROCLEA DX,STRING2MOV AH,9INT 21HLEA DX,STRING5MOV AH,9INT 21HLEA DX,WRITEMOV AH,10INT 21HLEA DX,STRING6MOV AH,9INT 21HMOV AH,3DHLEA DX,BUF+2MOV AL,1INT 21HMOV CX,AXMOV AH,40HLEA SI,WRITE+2MOV BL,[WRITE+1]MOV BH,0MOV [SI+BX],BYTE PTR '$'LEA DX,WRITE+2MOV BX,CXMOV CL,[WRITE+1]INT 21HJC S1LEA DX,STRING4MOV AH,9INT 21HJMP S2S1: LEA DX,STRING3MOV AH,9INT 21HS2: RETSUC ENDPCODES ENDSEND START运行结果:3、利用文件句柄将两个文件合并成一个文件。
要求:1)在第一个文件末尾处换行回车,插入“The second file as follow:”; 2)换行回车,把第二个文件内容存放在后面。
程序框图:开始打开文件1打开文件2将文件2指针移到开头读取文件2内容将文件1指针移到最后将文件2中读取的内容写入文件1结束源程序:DATAS SEGMENTSTRING1 DB 'Input path1:',0dh,0ah,'$'STRING2 DB 'Input path2:',0dh,0ah,'$'STRING3 DB 0dh,0ah,'The second file as follow:',0dh,0ah STRING0 DB 0dh,0ah,'$'STRING4 DB 'Successfully.',0dh,0ah,'$'PATHNAME1 DB 20,?,20 DUP(?)PATHNAME2 DB 20,?,20 DUP(?)FILE1 DW ?FILE2 DW ?BUF DB 30 DUP(' ')DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;打开文件1LEA DX,STRING1MOV AH,9INT 21HLEA DX,PATHNAME1MOV AH,10INT 21HLEA DX,STRING0MOV AH,9。