版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、昆明理工大学信息工程与自动化学院学生实验报告( 201 201 学年 第 二 学期 )课程名称:操作系统 开课实验室: 年 月 日年级、专业、班 学号 姓名 成绩实验项目名称文件管理指导教师 教师评语 教师签名: 年 月 日一、实验目的用c或c+语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。二、实验原理及基本技术路线图(方框原理图)用c模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一
2、定的存取权限控制。功能设计 :help显示命令帮助dir显示当前目录下的文件和文件夹exit退出系统create 文件名创建文本文件cdir 目录名创建文件夹read 文件名读取一个文件最多可同时读取五个close文件名关闭一个文件edit 文件名编辑一个文件cd 目录名进子目录或者上级目录attr 文件名显示该文件的属性del 文件名删除文件rename 文件名重命名 编辑功能流程图 删除文件流程图 创建文件流程图核心算法:bool format(void);/格式化bool install(void);/装载虚拟硬盘的数据void login(void);/用户登陆void showmen
3、u(void);/显示功能菜单bool onaction(void);/用户选择功能并执行void createfile(string str);/创建文件bool read(string str);/读取文件void editfile(string str);/编辑文件void delete(string str);/删除一个文件数据结构:/*-常变量-*/const unsigned int block_size=512;/块长const unsigned int data_block_num=512;/数据块数量const unsigned int dinode_start=4*bloc
4、k_size;/inode起始位置const unsigned int dinode_size=512;/inode大小const unsigned int dinode_num=32;/inode数量const unsigned int datastart=(2+dinode_num)*block_size;/数据区的开始地址const unsigned int account_num=10;/用户数量/*inode结构体*/struct inodeunsigned short di_tag;/*inode标识*/ unsigned short di_number;/*关联文件数,当为0时表
5、示删除文件,如一个目录至少包含两个文件:.和.*/unsigned short di_mode;/*存取模式:0为目录,1为文件*/ unsigned short di_userid;/*当前inode所属用户 0为根目录id,一次下去是管理员目录、用户目录*/unsigned short di_access;/*访问权限 0为不允许普通用户访问(公共目录),1为允许普通用户访问*/unsigned short di_size;/*文件大小,目录没有大小,值为0*/unsigned short di_ctime; /* 创建时间 */unsigned short di_mtime; /* 最后
6、一次修改时间*/unsigned short di_blockdata_block_num; /* 数据块块地址编号 */;/*超级块*/struct super_blockunsigned short s_inodes_count; /* 文件系统中inode的总数 */unsigned short s_blocks_count; /* 数据块总数 */unsigned short s_r_blocks_count; /* 保留块总数 */unsigned short s_free_blocks_count; / 空闲块总数 unsigned short s_free_inodes_coun
7、t; /* 空闲的inode总数 */unsigned short s_log_block_size; /* block 的大小 */;/*账户信息*/struct userunsigned short user_id;/用户idunsigned short user_access;/权限string username;/用户名string password;/密码;/*文件/目录结构*/struct directorystring name;/*目录名*/unsigned short d_ino;/*目录号*/;三、所用仪器、材料(设备名称、型号、规格等)。计算机一台四、实验方法、步骤#in
8、clude #include#include#includestruct openfiletable /打开文件表数据结构long offset; / 当前文件读写指针char file_name10; / 文件名数组long int file_start; / 文件起始块号long int file_length; / 文件长度(字节);struct fcb_block /fcb数据结构int flag; / 标志,-1表示未用,1表示文件用char file_name10; / 文件名数组long int file_date; / 文件建立日期 long int file_time; /
9、文件建立时间long int file_start; / 文件起始块号long int file_length; / 文件长度(字节);struct super_block / 超级块数据结构, 文件系统的分区信息,存放在0#物理块中 unsigned long int fs_totalsize; / 整个分区的总磁盘物理块数 unsigned long int fs_freesize; / 分区的所有空闲磁盘物理块数unsigned int fs_blocksize; / 文件系统的物理块大小(字节)unsigned int fs_fat_start; / fat的起始磁盘物理块号 unsi
10、gned int fs_fat_size; / fat占用的磁盘物理块数unsigned int fs_dir_start; / 根目录的起始磁盘物理块号unsigned int fs_dir_size; / 根目录占用的磁盘物理块数unsigned int fs_data_start; / 数据区起始磁盘物理块号unsigned long int fs_data_size; / 数据区的磁盘物理块数 ;const char diskname=filesys.dat; /磁盘文件名char rw_buffer512; / 读写使用的缓冲区struct fcb_block filefcb130;
11、 / 读写目录使用的数据结构struct super_block fssupblk; / 读写超级块使用的数据结构long int fat_buffer5000; / 读写fat使用的缓冲区,为简化在系统启动时全部装入内存,0为空闲struct openfiletable oft16; / 打开文件表,当前只使用oft0unsigned int block_size; / 物理块大小(字节)unsigned long int total_disk_size; / 磁盘总容量(物理块数)unsigned int total_dir_size; / 目录占有的物理块数unsigned int to
12、tal_fat_size; / fat占有的物理块数long int find_fcb; / 记录读fcb块的次数file *fsptr; / 模拟磁盘的文件指针/* 磁盘块的申请*/ unsigned long int get_block(unsigned long int count) /分配count个物理快,返回首块指针,其它已经连接unsigned long int tmp,firstblk,tmpcount;unsigned long int i; int flag=1;if (count fssupblk.fs_freesize) printf( = 没有足够磁盘容量,不能分配!
13、= n); return 0; tmpcount=0; for(i=fssupblk.fs_data_start;ifssupblk.fs_totalsize) printf( = 超出磁盘容量,不能读!= n); return; fseek(fsptr,fssupblk.fs_blocksize*addr,seek_set); fread(buf,512,1,fsptr); return;/* 写磁盘块*/ void write_block(unsigned long int addr,char *buf) if (addrfssupblk.fs_totalsize) printf( = 超
14、出磁盘容量,不能写!= n); return; fseek(fsptr,fssupblk.fs_blocksize*addr,seek_set); fwrite(buf,512,1,fsptr); return;/* 格式化磁盘*/ void real_format() unsigned long int bcount; long int fatval,i;char *c;/更改系统超级块信息 fssupblk.fs_totalsize=total_disk_size; fssupblk.fs_blocksize=block_size; fssupblk.fs_dir_start=1; fss
15、upblk.fs_dir_size=total_dir_size; fssupblk.fs_fat_start=total_dir_size+1; fssupblk.fs_fat_size=total_fat_size; fssupblk.fs_data_start=fssupblk.fs_fat_start+fssupblk.fs_fat_size; fssupblk.fs_data_size = fssupblk.fs_totalsize - fssupblk.fs_dir_size - fssupblk.fs_fat_size-1; fssupblk.fs_freesize= fssup
16、blk.fs_data_size; /初始化目录 for(i=0;i128;i+) filefcbi.flag=-1; /为-1表示fcb未使用fseek(fsptr,512l,seek_set);fwrite(&filefcb0,sizeof(struct fcb_block),128,fsptr); /初始化fat fatval=fssupblk.fs_fat_start*512; fseek(fsptr,fatval,seek_set); /定位文件指针 bcount=fssupblk.fs_fat_size+fssupblk.fs_dir_size+1; for(i=0;ibcount
17、;i+) fat_bufferi=-1; /标记已经使用的磁盘数据块,即fat区、目录区和启动区 for(;ifssupblk.fs_totalsize;i+) fat_bufferi=0; /为0表示为空的物理快 fwrite(&fat_buffer0,sizeof(long int),fssupblk.fs_totalsize,fsptr); /初始化数据区 for(i=0;i512;i+) rw_bufferi= ;/缓冲区清空 for(i=fssupblk.fs_data_start;ifssupblk.fs_totalsize;i+) write_block(i,rw_buffer)
18、; /缓冲区写入第i块 /*新建系统磁盘文件*/ void create_disk() long int i;unsigned long int total;fsptr=fopen(diskname,wb+);if(fsptr=null)printf( 不能建立磁盘所需的文件 !n);exit(0); / 建立磁盘文件 total=total_disk_size; for(i=0;itotal;i+) /建立大小为total的磁盘文件 fwrite(rw_buffer,512,1,fsptr); fclose(fsptr); fsptr=fopen(diskname,rb+); real_fo
19、rmat(); return;/*读写系统超级块信息*/ void read_boot() /读取磁盘超级块数据信息 rewind(fsptr);fread(&fssupblk,sizeof(struct super_block),1,fsptr);return;void fileboot() /超级块数据信息存盘 rewind(fsptr);fwrite(&fssupblk,sizeof(struct super_block),1,fsptr);return;/*fat操作*/ void loadfat() /装载全部fat到内存 fseek(fsptr,fssupblk.fs_fat_st
20、art*512,seek_set);fread(fat_buffer,sizeof(long int),fssupblk.fs_totalsize ,fsptr);return;void savefat() /fat到文件fat区 fseek(fsptr,fssupblk.fs_fat_start*512,seek_set);fwrite(fat_buffer,sizeof(long int),fssupblk.fs_totalsize,fsptr);return;/*显示超级块信息*/ void boot_dis() printf(fssupblk.fs_totalsize=%ldn,fss
21、upblk.fs_totalsize); printf(fssupblk.fs_blocksize=%dn,fssupblk.fs_blocksize); printf(fssupblk.fs_dir_start=%dn,fssupblk.fs_dir_start); printf(fssupblk.fs_dir_size=%dn,fssupblk.fs_dir_size); printf(fssupblk.fs_fat_start=%dn,fssupblk.fs_fat_start); printf(fssupblk.fs_fat_size=%dn,fssupblk.fs_fat_size)
22、; printf(fssupblk.fs_data_start=%dn,fssupblk.fs_data_start); printf(fssupblk.fs_data_size=%ldn,fssupblk.fs_data_size); printf(fssupblk.fs_freesize=%ldn,fssupblk.fs_freesize); /*系统初始化*/ void sys_init() /初始化fsptr=fopen(diskname,rb+);if(fsptr = null) create_disk(); read_boot();/boot_dis(); loadfat();re
23、turn;/*显示操作*/ void dir() /显示目录下的文件 int i,countfile=0; char str16; long int n,pos_dir,pos_fat;coutendl; pos_dir=fssupblk.fs_dir_start*512; pos_fat=fssupblk.fs_fat_start*512;fseek(fsptr,pos_dir,seek_set);while(ftell(fsptr)pos_fat) fread(&filefcb0,sizeof(struct fcb_block),16 ,fsptr); for(i=0;i16;i+) if
24、(filefcbi.flag = 1) /文件占有 countfile+; n = filefcbi.file_length; printf( %-15s%15d bytesn, filefcbi.file_name,file,n); coutendl;printf( 总共有 %d 个文件n,countfile);printf( 系统总共有 %ld 个物理块可用nn,fssupblk.fs_freesize); /*查找文件*/ /查找文件,文件存在返回当前fcb数组下标,否则返回-1int find_file(char *filename) int i;long int pos_dir,po
25、s_fat; pos_dir=fssupblk.fs_dir_start*512; pos_fat=fssupblk.fs_fat_start*512; find_fcb=0;fseek(fsptr,pos_dir,seek_set);while(ftell(fsptr)pos_fat) find_fcb+; fread(&filefcb0,sizeof(struct fcb_block),16 ,fsptr); for(i=0;i16;i+) if(filefcbi.flag!=-1) if(strcmp(filename,filefcbi.file_name) = 0) return i;
26、 /文件存在 return -1;/*创建文件*/ void create(char *fname,long int num) /在当前目录下创建一个名字为str的文件,长度为num int i,j; /true表示没有与该名字重名的文件 int tempnode; long int pos_dir,getnum=0;unsigned long int blkcount;blkcount= num/512+1; /计算需要的物理块 if(fssupblk.fs_freesize blkcount) /磁盘没有足够空间 printf(n 磁盘没有足够空间,不能建立 !nn); return;te
27、mpnode=find_file(fname);if (tempnode!=-1) /表示文件存在 printf(n 文件已经存在,不需要建立 !nn); return;/ 建立文件的处理 pos_dir=fssupblk.fs_dir_start*fssupblk.fs_blocksize;fseek(fsptr,pos_dir,seek_set); /定位到目录区 for(i=0; ifssupblk.fs_dir_size; i+) /read_block(i+fssupblk.fs_dir_start,(char *)filefcb);fread(&filefcb0,sizeof(st
28、ruct fcb_block),16 ,fsptr); for(j=0;j16;j+)if(filefcbj.flag = -1) /找到空目录项/ 分配空间, 标记fcb数据项,并将fcb写磁盘getnum=get_block(blkcount);if(getnum=-1) printf(不能分配存储空间 n);return;filefcbj.file_start=getnum;filefcbj.flag = 1;filefcbj.file_length=num;strcpy(filefcbj.file_name,fname);/filefcb.file_time=/filefcb.file
29、_date=/ 改变磁盘fcb值 pos_dir=pos_dir+sizeof(struct fcb_block)*(i*16+j);fseek(fsptr,pos_dir,seek_set); /定位到目录区的fcb项fwrite(&filefcbj,sizeof(struct fcb_block),1 ,fsptr); /write_block(i+fssupblk.fs_dir_start,(char *)filefcb); printf( 文件占用了 %d 个物理块n,blkcount); printf( 系统还有 %ld 个物理块可用nn,fssupblk.fs_freesize);
30、return; /没有fcb项,不能建立文件 cout当前没有足够的目录区,不能建立文件 ! endl; return; /*格式化*/ void format()char ch; coutch; if(ch=y|ch=y) real_format(); printf(n format successful!nn);/*删除文件操作*/ void del(char *fname) long int tempnode;long int pos_dir;tempnode=find_file(fname);if (tempnode=-1) /表示文件不存在 printf(n 文件不存在,不能删除 !
31、nn); return;/ 删除文件的处理 put_block(filefcbtempnode.file_start); / 释放文件存储空间 filefcbtempnode.flag =-1; / 标记fcb项可用 / 修改的fcb项写回磁盘pos_dir=fssupblk.fs_dir_start*fssupblk.fs_blocksize+(find_fcb-1)*16+tempnode)*sizeof(struct fcb_block);fseek(fsptr,pos_dir,seek_set); /定位到目录区fwrite(&filefcbtempnode,sizeof(struct
32、 fcb_block),1 ,fsptr);return; /*写文件*/ void write(char *fname ,int num)/写文件,仅实现在文件尾部填加内容,并限制在512个字节内 int tempnode; int i,j,x;int rescount;long int pos_dir; if (num 512) printf(n 不能写大于512字节的数据 !nn); return; tempnode=find_file(fname); if (tempnode=-1) /表示文件不存在 printf(n 文件不存在,不能写 !nn); return; / 写文件的处理c
33、har *string=new char num; /申请空间for(i=0;istringi; rescount=filefcbtempnode.file_length % fssupblk.fs_blocksize; if (num fssupblk.fs_blocksize-rescount)if (fssupblk.fs_freesize1) printf(n 文件系统没有足够空间,不能写 !nn);return;for(j=filefcbtempnode.file_start;fat_bufferj!=-1;j=fat_bufferj); read_block(j,rw_buffer
34、); if (num= fssupblk.fs_blocksize-rescount)for(i=0;inum;i+) rw_bufferrescount+i=stringi;write_block(j,rw_buffer); else for(i=0;ifssupblk.fs_blocksize-rescount;i+) rw_bufferrescount+i=stringi; write_block(j,rw_buffer); fat_bufferj=get_block(1); j=fat_bufferj; for(x=0;xfssupblk.fs_blocksize;x+) rw_buf
35、ferx= ; for(x=0;xnum-(fssupblk.fs_blocksize-rescount);x+) rw_bufferx=stringi+x; write_block(j,rw_buffer); /delete string;/ 修改fcb项并写回磁盘 filefcbtempnode.file_length+=num; / 增加文件的长度pos_dir=fssupblk.fs_dir_start*fssupblk.fs_blocksize+(find_fcb-1)*16+tempnode)*sizeof(struct fcb_block);fseek(fsptr,pos_dir
36、,seek_set); /定位到目录区fwrite(&filefcbtempnode,sizeof(struct fcb_block),1 ,fsptr); cin.ignore(10000,n); /清除输入流缓冲区coutendl= 写文件完成!= filefcbtempnode.file_length) /读的数据超出文件范围 printf(n 超出文件范围,不能读 !nn); return; / 读文件的处理 printf(n=n); stblknum=start/fssupblk.fs_blocksize+1; / 起始物理块 offset=start%fssupblk.fs_blo
37、cksize; / 起始物理块的偏移量if(start+countfilefcbtempnode.file_length ) count= filefcbtempnode.file_length-start;for(i=filefcbtempnode.file_start,j=1;jfilefcbtempnode.file_length ) count= filefcbtempnode.file_length-start;if(count=fssupblk.fs_blocksize-offset) for(j=0;jcount;j+) coutrw_bufferj+offset;else fo
38、r(j=0;jfssupblk.fs_blocksize-offset;j+) coutrw_bufferj+offset; dspnum=(count-(fssupblk.fs_blocksize-offset)/fssupblk.fs_blocksize+1; for(j=0;jdspnum-1;j+) i=fat_bufferi; read_block(i,rw_buffer); for(x=0;xfssupblk.fs_blocksize;x+) coutrw_bufferx; i=fat_bufferi; read_block(i,rw_buffer); x=(count-(fssupblk.fs_blocksize-offset)%fssupblk.fs_blocksize; for(j=0;jx;j+) coutrw_bufferx;coutendl= 读文件完成!=endl;return;/*显示帮助*/ void display_help()printf( 写文件 wf filename
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文库发布:胆囊课件
- 胃肠疾病CT诊断APP课件
- 2026届湖南省怀化市中方县第二中学生物高二上期末联考试题含解析
- 四川省成都市达标名校2026届生物高一上期末调研模拟试题含解析
- 医疗数据合规:风险识别与应对策略
- 医疗数据区块链存储的性能调优策略
- 上海市交大附中嘉定分校2026届高二上数学期末考试试题含解析
- 医疗数据共享的激励机制创新:从中心化去中心化
- 医疗数据共享的区块链激励与医保协同
- 医疗数据共享的刑事责任边界
- 金刚网窗合同范本
- 2026年企业生产计划制定优化与订单交付率提升方案
- 2025湖北交投集团总部一般管理岗位遴选拟录用人员笔试历年参考题库附带答案详解
- 借用土地合同范本
- 支撑梁钢筋自动计算表模板
- 2025天津大学管理岗位集中招聘15人笔试考试备考题库及答案解析
- 请结合材料理论联系实际分析如何正确评价人生价值?人生价值的实现需要哪些条件?参考答案
- 2026年党支部主题党日活动方案
- 2025年福鼎时代面试题及答案
- 幼儿园中班交通安全教育课件
- 2025 年国家层面数据资产政策汇编(全景解读版)
评论
0/150
提交评论