文件操作实验报告.docx
- 文档编号:29147307
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:22
- 大小:161.62KB
文件操作实验报告.docx
《文件操作实验报告.docx》由会员分享,可在线阅读,更多相关《文件操作实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
文件操作实验报告
姓名
郑素菲
王锟
学号
2011210685
2011210663
实验成绩
华中师范大学计算机科学系
实验报告书
实验题目:
基于两级目录结构的简单文件系统的管理与操作
课程名称:
操作系统
主讲教师:
叶俊民教授
辅导教师:
课程编号:
班级:
1102班
实验时间:
2013.12.09
CDIO性质的实践步骤:
构思性实践(C)
实验模拟操作系统利用文件命令对文件夹和文件的操作,对文件夹的操作为文件夹创建和文件夹删除,对文件的操作为文件的创建、删除和修改及对文件的读写。
利用c语言的部分函数和system函数实现对文件夹和文件的操作。
小组成员熟悉文件操作以及c语言的基本数据结构,可以完成主文件目录[MFD]和用户文件目录[UFD]的建立。
设计性实践(D)(准备怎么做)
1、首先确定文件的基本数据结构:
Elemtypef(用于保存文件夹的信息,用户的信息)、file(文件夹目录,即主文件目录)、Elemtyped(用于保存文件的信息)、document(文件目录,即用户文件目录),以及每个数据结构所要进行的操作。
2、将对主目录和用户文件目录的操作的函数确定出来,包括每个函数的参数和返回对象,并且逐个完成函数并对其进行测试。
3、确定用户的所能进行的操作,并将其与对应的函数操作进行对应。
4、完整的测试每个功能,找出存在的缺陷,并对其进行调整。
实现性实践(I)(做的结果)
1、完成代码的编写,形成.c源文件与.exe可执行文件。
2、进行演示,演示应包含所有的功能点,将演示结果截图保存。
3、完成实验报告说明。
运行性实践(O)(实验的方式)
1、小组成员确定程序需要完成的功能,并详细列出为实现某一功能点的函数的参数和其返回形式,为后期检查程序是否满足原定的功能做准备。
2、确定编码人员,由编码人员完成基本编码工作,另一人负责对完成的程序进行部分程序的测试,检查是否满足所编写的函数的功能点。
3、对不满足的功能点或缺少的功能点进行修改或增加,重复第2步,直至符合要求。
4、确定测试人员,对代码进行整体的测试。
5、完成上机验收。
一、实验目的:
1、模拟文件系统实现的基本功能,了解文件系统的基本结构和文件的各种管理方法
2、理解文件管理的工作过程
3、加深理解文件系统的内部功能及内部实现
4、加深各种文件操作命令的实质内容和执行过程的了解
二、实验内容:
要求编程模拟一个简单的文件系统,以实现对文件系统的管理和控制功能,支持用户对自己文件的管理与操作。
具体要求如下:
(1)要求本文件系统采用两级目录,即设置主文件目录[MFD]和用户文件目录[UED]。
在主文件目录中,每个用户目录都占有一个目录项,其目录项中包含文件名和指向该文件目录文件。
在用户文件目录UFD中,这些文件目录具有相似的结构。
具体测试时可考虑:
设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件,并需要对文件设置保护措施。
(2)设计并实现Create、Open、Read、Write、Close、Delete等文件命令的算法,用户可通过菜单方式或者API方式实现对自己文件的管理。
三、实验环境:
实践平台:
windows
编写环境:
VC6.0
编译器:
VC6.0
四、实验设计原理
1、采用二级结构优化,设置主文件目录和用户文件目录。
在主文件目录中,每一个用户都占有一个目录项,该目录项中包含用户的部分信息和指向该文件目录的指针。
在用户文件目录中,包含用户创建的每个文件的部分信息。
2、利用文件操作命令实现Create、Open、Read、Write、Close、Delete等文件命令的算法。
五、实验详细实现过程与算法流程
1、对主文件目录进行初始化;
2、用户可以根据需要对文件进行操作(createuser,deleteuser,openuser,closeuser,createfile,deletefile,updatefile,openfile,closefile)
六、实验调试(问题的发现、分析、解决方案与创新)
所发现的问题如下:
1、问题
不为空的文件和文件夹无法删除。
2、分析
当文件中有内容时,使用_unlink无法删除,只能删除无内容的文件。
3、解决
将_unlink改为system(del“文件路径”)
4、创新
1.自动识别在磁盘上已经建好的用户目录,启动时,自动将这些用户信息写入内存结构
2.命令操作,直接快速。
七、软件体系结构及全局控制流程设计
可以将一个完成独立操作的函数看做一个模块,其中Main函数模块如图1所示。
图1.基于两级目录的文件系统的全局控制流设计
1、主文件目录模块
1.1增加用户文件夹模块;
1.2.删除用户文件夹模块;
1.3.显示用户文件夹模块;
1.4.用户文件操作模块。
2、用户文件操作模块
2.1增加文件模块;
2.2删除文件模块;
2.3读文件模块;
2.4打开文件模块;
2.5写文件模块;
2.6关闭文件模块;
2.7显示用户所有文件信息模块。
两级目录的文件系统的软件体系结构设计是基于调用/返回风格,子模块详细功能信息如下
子模块
含义
voidInitQueuef()
对主目录文件进行定义
voidInitQueued(document&d)
对新建的一个用户开辟一个文件内存空间
voidprintfqueue()
将所有用户的文件名输出
documentcreateUser(char*name,inti)
创建一个用户,其返回为用户文件所指向的文件的地址,参数name是所创建的用户名。
i为创建用户的线性表的位置
voiddeleteUser(char*name)
删除一个用户(文件夹),通过给出的参数name来删除
voidopenUser(char*name)
打开用户name的文件夹
voidviewUser(char*name)
查看用户文件夹中的所有文件
voidcloseUser(char*name)
将用户的文件夹删除
char*getPath(char*n)
通过参数name传来的值,获取文件的路径
voidcreateFile(char*fname)
创建用户的文件fname为.txt文件
voiddeleteFile(char*name)
删除用户的文件name
voidopenFile(char*name)
打开用户放入文件name,并将其内容输出
voidwriteFile(char*name,char*content)
将内容content追加到文件name中
表1.子模块功能分析
八、源程序(加注释)
1、头文件及数据定义
#include
#include
#include
#include
#definenamesize20
#defineMAXSIZE10
//对每个用户创建一个文件夹,用线性表将其信息保存起来
structElemtypef{
intnumber;
charuname[namesize];
intlocation;
}E;
structfile{
Elemtypef*elem;
intlistsize;
intlength;
}uf;
//将每个用户创建的文件夹用线性表记录起来
structElemtyped{
intfsize;
charfname[namesize];
charfather[namesize];
};
structdocument{
Elemtyped*elem;
intlistsize;
intlength;
intnory;
};
//定义队列
filef;
documentd[MAXSIZE];
//定义一个全局变量,保存当前打开的用户的名字
charnowname[namesize];
2、子模块函数
//构造一个空队列,放用户的文件夹
voidInitQueuef()
{
f.elem=(Elemtypef*)malloc(sizeof(Elemtypef)*MAXSIZE);
f.length=0;
f.listsize=MAXSIZE;
for(inti=0;i f.elem[i].number=0; strcpy(f.elem[i].uname,""); } } //构造空队列,放用户创建的文件夹 voidInitQueued(document&d) { d.elem=(Elemtyped*)malloc(sizeof(Elemtyped)*MAXSIZE); d.length=0; d.listsize=MAXSIZE; for(inti=0;i d.elem[i].fsize=0; strcpy(d.elem[i].father,""); strcpy(d.elem[i].fname,""); } } //输出当前线性表中的数据 voidprintfqueue() { for(inti=0;i printf("name=%snumber=%d\n",f.elem[i].uname,f.elem[i].number); } } //创建一个用户 documentcreateUser(char*name,inti) { //printf("s=%s\n",name); intstatus; if(f.length<=10){ status=mkdir(name);//这是在程序所在当前文件夹下创建book if(status==0){ printf("创建成功~\n"); //将数据保存到线性表中 strcpy(f.elem[f.length].uname,name); f.elem[f.length].number=0; f.elem[f.length].location=i; f.length++; }else{ printf("创建失败~\n"); } }else{ printf("创建失败,用户数已经到达上限了~~~\n"); } //printf("status=%d\n",status); documentd; InitQueued(d); d.nory=1; returnd; } //删除用户文件夹c voiddeleteUser(char*name) { intstate=-1; state=rmdir(name); if(state==0){ //将保存在用户线性表的用户名删除 for(inti=0;i if(strcmp(f.elem[i].uname,name)==0){ f.elem[i].number=0; strcpy(f.elem[i].uname,""); f.elem[i].location=-1; f.length--; //将其用户创建的所有文件删除,即重新定义 intt=f.elem[i].location; InitQueued(d[t]); d[t].nory=0; } } strcpy(nowname,""); printf("用户的文件夹已经删除~~\n"); }else{ printf("无法删除文件夹~~\n"); } } //打开用户文件夹 voidopenUser(char*name) { intitem; if(strcmp("",nowname)! =0){ printf("已经打开了一个文件夹,不能打开,请把另一个关了~~\n"); }else{ printf("文件夹已经打开~~\n"); //将用户名保存起来 strcpy(nowname,name); //输出用户的文件夹中的所有文件 for(inti=0;i if(strcmp(f.elem[i].uname,name)==0){ item=f.elem[i].location; } } for(intj=0;j printf("%s%d\n",d[item].elem[j].fname,d[item].elem[j].fsize); } } } //输出文件夹的内容 voidviewUser(char*name) { intitem; if(strcmp("",nowname)==0){ printf("没有打开文件夹~~\n"); }else{ //输出用户的文件夹中的所有文件 for(inti=0;i if(strcmp(f.elem[i].uname,name)==0){ item=f.elem[i].location; } } for(intj=0;j printf("%s%d\n",d[item].elem[j].fname,d[item].elem[j].fsize); } } } //将用户文件夹关闭 voidcloseUser(char*name) { strcpy(nowname,""); printf("文件夹已关闭~~\n"); } //将两个字符串连接起来,求出path char*getPath(char*n) { char*path=newchar[100]; strcpy(path,nowname); strcat(path,"\\"); strcat(path,n); strcat(path,".txt"); //printf("nowname=%s\n",nowname); returnpath; } //在当前打开的用户的文件夹下创建一个文件 voidcreateFile(char*fname) { if(strcmp(nowname,"")==0){ printf("没有将文件夹打开,无法创建文件~~\n"); }else{ FILE*fq; fq=fopen(getPath(fname),"w"); if(fq==NULL){ printf("创建文件失败~~\n"); }else{ for(inti=0;i if(strcmp(f.elem[i].uname,nowname)==0){ //将文件记录起来 intitem=f.elem[i].location; strcpy(d[item].elem[d[item].length].father,nowname); strcpy(d[item].elem[d[item].length].fname,fname); d[item].length++; } } printf("创建成功~~\n"); } fclose(fq); } } //删除文件 voiddeleteFile(char*name) { if(strcmp(nowname,"")==0){ printf("没有将文件夹打开,无法删除文件~~\n"); }else{ //intstate=_unlink(getPath(name)); charpath[100]; strcpy(path,"delF: \\操作系统实验\\os-5\\"); strcat(path,getPath(name)); intstate=system(path); //printf("name=%s\n",getPath(name)); if(state! =0){ printf("删除文件失败~~\n"); }else{ for(inti=0;i if(strcmp(f.elem[i].uname,nowname)==0){//找到用户的文件夹 intitem=f.elem[i].location; for(intj=0;j if(strcmp(d[item].elem[j].fname,name)==0){//将文件记录删除 strcpy(d[item].elem[d[item].length].father,""); strcpy(d[item].elem[d[item].length].fname,""); d[item].length--; }//if }//for }//if }//for printf("删除成功~~\n"); } } } //打开文件,将文件内容输出 voidopenFile(char*name) { if(strcmp(nowname,"")==0){ printf("没有将文件夹打开,无法打开文件~~\n"); }else{ char*buff; FILE*fq; fq=fopen(getPath(name),"r"); if(fq==NULL){ printf("打开文件失败~~~\n"); }else{ fseek(fq,0L,SEEK_END); intflen=ftell(fq); buff=(char*)malloc(flen+1); fseek(fq,0L,SEEK_SET); fread(buff,flen,1,fq); buff[flen]='\0'; printf("%s的内容: %s\n",getPath(name),buff); } fclose(fq); } } //写文件 voidwriteFile(char*name,char*content) { if(strcmp(nowname,"")==0){ printf("没有将文件夹打开,无法打开文件~~\n"); }else{ FILE*fq; fq=fopen(getPath(name),"a"); if(fq==NULL){ printf("打开文件失败~~~\n"); }else{ if(fputs(content,fq)==EOF){ printf("写入失败~~\n"); }else{ printf("写入成功~~\n"); //openFile(name); } } fclose(fq); } } 3、主模块函数 voidmain() { chars[namesize]; charname[namesize]; inti=0; InitQueuef(); printf(">>"); scanf("%s%s",s,name); while(strcmp(s,"exit")! =0){ if(strcmp(s,"createuser")==0){ d[i]=createUser(name,i); i++; printfqueue(); }elseif(strcmp(s,"deleteuser")==0){ deleteUser(name); printfqueue(); }elseif(strcmp(s,"openuser")==0){ openUser(name); }elseif(strcmp(s,"closeuser")==0){ closeUser(name); }elseif(strcmp(s,"viewuser")==0){ viewUser(name); }elseif(strcmp(s,"createfile")==0){ createFile(name); }elseif(strcmp(s,"deletefile")==0){ deleteFile(name); }elseif(strcmp(s,"openfile")==0){ openFile(name); }elseif(strcmp(s,"writefile")==0){ charcontent[100]; printf("请输入要追加的内容: "); scanf("%s",content); writeFile(name,content); }else{ printf("指令错误~~\n"); } printf(">>"); scanf("%s%s",s,name); } //printf("s=%s\n",s); } 九、实验结果分析 (1)添加用户 (2)删除用户 (4)增加文件 (5)删除文件 (6)打开文件 (7)写文件 十、实验改进意见与建议 欠缺安全性的考虑,在以后应该在安全性上做相关设计、修改。 十一、实验总结 本实验基本完成了实验需求中的建立用户目录,并对目录文件进行基本操作(增加、删除、打开、关闭、读、写操作),并具有一定的健壮性,在用户输入错误或者文件不存在的情况下会有错误提示,当用户没有打开文件夹时,无法打开文件。 实验不足之处是安全性欠缺,不提供用户密码验证的功能。 通过完成本次实验,更加熟悉了文件命令的使用以及两级目录文件系统。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 操作 实验 报告