




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include #include #include #include #includeusing namespace std;#define blksize 512/ 数据块的大小 #define blknum 512/ 数据块的块数#define inodesize 32/ i节点的大小#define inodenum 32/ i节点的数目#define filenum 8/ 打开文件表的数目/用户 typedef structchar user_name10; / 用户名char password10; / 密码 user;/i节点 typedef structshort inum; /
2、 文件i节点号char file_name10; / 文件名char type; / 文件类型char user_name10; / 文件所有者short iparent; / 父目录的i节点号 short length; / 文件长度short address2; / 存放文件的地址 inode;/打开文件表 typedef structshort inum; / i节点号char file_name10; / 文件名short mode; / 读写模式(1:read, 2:write, / 3:read and write) file_table;/ 申明函数void login(void
3、);void init(void);int analyse(char *);void save_inode(int);int get_blknum(void);void read_blk(int);void write_blk(int);void release_blk(int);void pathset();void del(int);/ 用户命令处理函数 void help(void);void cd(void);void dir(void);void mkdir(void);void creat(void);void open(void);void read(void);void wri
4、te(void);void close(void);void delet(void);void logout(void);void command(void);void quit();/main.cpp文件/#include head.h/定义全局变量 charchoice;intargc;/ 用户命令的参数个数char*argv5;/ 用户命令的参数intinum_cur;/ 当前目录chartemp2*blksize;/ 缓冲区useruser;/ 当前的用户charbitmapblknum;/ 位图数组inodeinode_arrayinodenum;/ i节点数组file_table
5、file_arrayfilenum;/ 打开文件表数组charimage_name10 = data.dat;/ 文件系统名称file*fp;/ 打开文件指针/创建映像hd,并将所有用户和文件清除void format(void)int i;inode inode;printf(will be to format filesystem.n);printf(warning:all data on this filesystem will be lost!n);printf(proceed with format(y/n)?);scanf(%c, &choice); getchar(); if(c
6、hoice = y) | (choice = y) if(fp=fopen(image_name, w+b) = null) printf(cant create file %sn, image_name); exit(-1); for(i = 0; i blksize; i+) fputc(0, fp); inode.inum = 0; strcpy(inode.file_name, /); inode.type = d; strcpy(inode.user_name, /); inode.iparent = 0; inode.length = 0; inode.address0 = -1;
7、 inode.address1 = -1; fwrite(&inode, sizeof(inode), 1, fp); inode.inum = -1; for(i = 0; i 31; i+) fwrite(&inode, sizeof(inode), 1, fp); for(i = 0; i blknum*blksize; i+) fputc(0, fp); fclose(fp); / 打开文件user.txt if(fp=fopen(user.txt, w+) = null) printf(cant create file %sn, user.txt); exit(-1); fclose
8、(fp); printf(filesystem created successful.please first login!n);return ;/ 功能: 用户登陆,如果是新用户则创建用户void login(void)char *p;int flag;char user_name10;char password10;char file_name10 = user.txt;do printf(login:); gets(user_name); printf(password:); p=password; while(*p=getch() if(*p = 0x0d) *p=0; /将输入的回车
9、键转换成空格 break; printf(*); /将输入的密码以*号显示 p+; flag = 0; if(fp = fopen(file_name, r+) = null) printf(ncant open file %s.n, file_name); printf(this filesystem not exist, it will be create!n); format(); login(); while(!feof(fp) fread(&user, sizeof(user), 1, fp); / 已经存在的用户, 且密码正确 if(!strcmp(user.user_name,
10、user_name) & !strcmp(user.password, password) fclose(fp); printf(n); return ; / 已经存在的用户, 但密码错误 else if(!strcmp(user.user_name, user_name) printf(nthis user is exist, but password is incorrect.n); flag = 1; fclose(fp); break; if(flag = 0) break;while(flag);/ 创建新用户if(flag = 0) printf(ndo you want to c
11、reat a new user?(y/n):); scanf(%c, &choice); gets(temp); if(choice = y) | (choice = y) strcpy(user.user_name, user_name); strcpy(user.password, password); fwrite(&user, sizeof(user), 1, fp); fclose(fp); return ; if(choice = n) | (choice = n) login();/ 功能: 将所有i节点读入内存void init(void)int i;if(fp = fopen
12、(image_name, r+b) = null) printf(cant open file %s.n, image_name); exit(-1);/ 读入位图for(i = 0; i blknum; i+) bitmapi = fgetc(fp);/ 显示位图/ 读入i节点信息for(i = 0; i inodenum; i+) fread(&inode_arrayi, sizeof(inode), 1, fp);/ 显示i节点/ 当前目录为根目录inum_cur = 0;/ 初始化打开文件表for(i = 0; i filenum; i+)file_arrayi.inum = -1;/
13、 功能: 分析用户命令, 将分析结果填充argc和argv/ 结果: 0-13为系统命令, 14为命令错误int analyse(char *str)int i;char temp20;char *ptr_char;char *syscmd=help, cd, dir, mkdir, create, open, read, write, close, delet, logout, clear,format,quit;argc = 0;for(i = 0, ptr_char = str; *ptr_char != 0; ptr_char+) if(*ptr_char != ) while(*pt
14、r_char != & (*ptr_char != 0) tempi+ = *ptr_char+; argvargc = (char *)malloc(i+1); strncpy(argvargc, temp, i); argvargci = 0; argc+; i = 0; if(*ptr_char = 0) break; if(argc != 0) for(i = 0; (i 14) & strcmp(argv0, syscmdi); i+); return i;else return 14;/ 功能: 将num号i节点保存到hd.datvoid save_inode(int num)if
15、(fp=fopen(image_name, r+b) = null) printf(cant open file %sn, image_name); exit(-1);fseek(fp, blknum +num*sizeof(inode), seek_set);fwrite(&inode_arraynum, sizeof(inode), 1, fp);fclose(fp);/ 功能: 申请一个数据块int get_blknum(void)int i;for(i = 0; i 512) add1 = inode_arraynum.address1;if(fp = fopen(image_name
16、, r+b) = null) printf(cant open file %s.n, image_name); exit(-1);fseek(fp, blksize+inodesize*inodenum +add0*blksize, seek_set);ch = fgetc(fp);for(i=0; (i len) & (ch != 0) & (i = 512) fseek(fp,blksize+inodesize*inodenum+add1*blksize, seek_set); ch = fgetc(fp); for(; (i len) & (ch != 0); i+) tempi = c
17、h; ch = fgetc(fp); tempi = 0;fclose(fp);/ 功能: 将temp的内容输入hd的数据区void write_blk(int num)int i, len;int add0, add1;add0 = inode_arraynum.address0;len = inode_arraynum.length;if(fp = fopen(image_name, r+b) = null) printf(cant open file %s.n, image_name); exit(-1);fseek(fp, blksize+inodesize*inodenum+add0
18、*blksize, seek_set);for(i=0; (ilen)&(tempi!=0)&(i 512); i+) fputc(tempi, fp);if(i = 512) add1 = inode_arraynum.address1; fseek(fp, blksize+inodesize*inodenum+add1*blksize, seek_set); for(; (i len) & (tempi != 0); i+) fputc(tempi, fp);fputc(0, fp);fclose(fp);/ 功能: 释放文件块号为num的文件占用的空间void release_blk(i
19、nt num)file *fp;if(fp=fopen(image_name, r+b) = null) printf(cant open file %sn, image_name); exit(-1);bitmapnum = 0;fseek(fp, num, seek_set);fputc(0, fp);fclose(fp);/ 功能: 显示帮助命令void help(void)printf(command: n help - show help menu nclear - clear the screen ncd - change directory nmkdir - make direc
20、tory ncreate - create a new file nopen - open a exist file nread - read a file nwrite - write something to a file nclose - close a file ndelet - delete a exist file or directory nformat - format a exist filesystem nlogout - exit user nquit - exit this systemn);/设置文件路径void pathset()char path50;int m,
21、n;if(inode_arrayinum_cur.inum = 0) strcpy(path,user.user_name);else strcpy(path,user.user_name); m=0; n=inum_cur; while(m != inum_cur) while(inode_arrayn.iparent != m) n = inode_arrayn.iparent; strcat(path,/); strcat(path,inode_arrayn.file_name); m = n; n = inum_cur; printf(%s$,path);/ 功能: 切换目录(cd .
22、 或者 cd dir1)void cd(void)int i;if(argc != 2) printf(command cd must have two args. n); return ;if(!strcmp(argv1, .) inum_cur = inode_arrayinum_cur.iparent;else for(i = 0; i 0)& (inode_arrayi.type=d)& (inode_arrayi.iparent=inum_cur)& !strcmp(inode_arrayi.file_name,argv1)& !strcmp(inode_arrayi.user_na
23、me,user.user_name) break; if(i = inodenum) printf(this directory isnt exsited.n); else inum_cur = i;/ 功能: 显示当前目录下的子目录和文件(dir)void dir(void)int i;int dcount=0,fcount=0;short bcount=0;if(argc != 1) printf(command dir must have one args. n); return ;/ 遍历i节点数组, 显示当前目录下的子目录和文件名for(i = 0; i 0) & (inode_ar
24、rayi.iparent = inum_cur)& !strcmp(inode_arrayi.user_name,user.user_name) if(inode_arrayi.type = d) dcount+; printf(%-20sn, inode_arrayi.file_name); else fcount+; bcount+=inode_arrayi.length; printf(%-20s%12d bytesn, inode_arrayi.file_name,inode_arrayi.length); printf(n %d file(s)%11d bytesn,fcount,b
25、count);printf( %d dir(s) %11d bytes freespacen,dcount,1024*1024-bcount);/ 功能: 在当前目录下创建子目录(mkdir dir1)void mkdir(void)int i;if(argc != 2)printf(command mkdir must have two args. n);return ;/ 遍历i节点数组, 查找未用的i节点for(i = 0; i inodenum; i+) if(inode_arrayi.inum 0) break; if(i = inodenum) printf(inode is fu
26、ll.n); exit(-1);inode_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1);inode_arrayi.type = d;strcpy(inode_arrayi.user_name,user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 在当前目录下创建文件(creat file)void create(void)int i;if(argc != 2) printf(command creat
27、must have two args. n); return ;for(i = 0; i 0) & (inode_arrayi.type = f) & !strcmp(inode_arrayi.file_name, argv1) printf(this file is exsit.n); return ; for(i = 0; i inodenum; i+) if(inode_arrayi.inum 0) break;if(i = inodenum) printf(inode is full.n); exit(-1);inode_arrayi.inum = i;strcpy(inode_arr
28、ayi.file_name, argv1);inode_arrayi.type = f;strcpy(inode_arrayi.user_name, user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 打开当前目录下的文件(open file1)void open()int i, inum, mode, filenum;if(argc != 2) printf(command open must have two args. n); return ;for(i =
29、 0; i 0) & (inode_arrayi.type = f) & !strcmp(inode_arrayi.file_name,argv1)& !strcmp(inode_arrayi.user_name,user.user_name) break;if(i = inodenum) printf(the file you want to open doesnt exsited.n); return ;inum = i;printf(please input open mode:(1: read, 2: write, 3: read and write):);scanf(%d, &mod
30、e);getchar();if(mode 3) printf(open mode is wrong.n); return;for(i = 0; i filenum; i+) if(file_arrayi.inum 0) break;if(i = filenum) printf(the file table is full, please close some file.n); return ;filenum = i;file_arrayfilenum.inum = inum; strcpy(file_arrayfilenum.file_name, inode_arrayinum.file_na
31、me);file_arrayfilenum.mode = mode; printf(open file %s by , file_arrayfilenum.file_name);if(mode = 1) printf(read only.n);else if(mode = 2) printf(write only.n);else printf(read and write.n);/ 功能: 从文件中读出字符(read file1)void read()int i, inum;if(argc != 2) printf(command read must have two args. n); re
32、turn;for(i = 0; i 0) & !strcmp(file_arrayi.file_name,argv1) break;if(i = filenum) printf(open %s first.n, argv1); return ;else if(file_arrayi.mode = 2) printf(cant read %s.n, argv1); return ;inum = file_arrayi.inum;printf(the length of %s:%d.n, argv1, inode_arrayinum.length);if(inode_arrayinum.lengt
33、h 0) read_blk(inum); for(i = 0; (i inode_arrayinum.length) & (tempi != 0); i+) printf(%c, tempi);/ 功能: 向文件中写入字符(write file1)void write()int i, inum, length;if(argc != 2) printf(command write must have two args. n); return ;for(i = 0; i 0)& !strcmp(file_arrayi.file_name,argv1) break; if(i = filenum)
34、printf(open %s first.n, argv1); return ;else if(file_arrayi.mode = 1) printf(cant write %s.n, argv1); return ;inum = file_arrayi.inum;printf(the length of %s:%dn, inode_arrayinum.file_name, inode_arrayinum.length);if(inode_arrayinum.length = 0) i=0; inode_arrayinum.address0 = get_blknum(); printf(in
35、put the data(ctrl+z to end):n); while(i 512) inode_arrayinum.address1 = get_blknum(); save_inode(inum); write_blk(inum);else printf(this file cant be written.n);/ 功能: 关闭已经打开的文件(close file1)void close(void)int i;if(argc != 2) printf(command close must have two args. n); return ;for(i = 0; i 0) & !str
36、cmp(file_arrayi.file_name, argv1) break;if(i = filenum) printf(this file doesnt be opened.n); return ;else file_arrayi.inum = -1; printf(close %s success!n, argv1);/回收i节点,有文件则删除文件void del(int i)inode_arrayi.inum = -1;if(inode_arrayi.length 0) release_blk(inode_arrayi.address0); if(inode_arrayi.length = 512) release_blk(inode_arrayi.address1);save_inode(i);/删除子目录树和文件void delet(void) if(argc != 2) printf(command delete must have two args. n); return ;int n,t,i;stack istk; for(i = 0; i =0) & (inode_arrayi.iparent = inum_cur)& (!strcmp(inode_arrayi.file_name,argv1)& (!
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 发布新产品时应关注的品牌策略计划
- 2025艺人经纪合同范本合同样本
- 社团活动年度总结计划
- 团队协作工具使用的月度计划
- 班级小组讨论的高效实施计划
- 工业自动化系统集成及应用案例分析
- 游戏账号买卖交易平台合作协议
- 2025年银川货运上岗证考试题答案
- 2025年荆州货运资格证培训考试题
- 环境监测设备性能优化指南
- 可爱的中国教案全册
- 《酒店概论》考试复习参考题库(含答案)
- 版式设计网格课件
- 消防安全检查表(车间)
- 产品报价单(5篇)
- 大飞机C919:追梦五十载,“破茧化蝶”
- 品牌视觉形象设计智慧树知到答案章节测试2023年天津科技大学
- 高考语文复习-议论文结尾写作之深化主旨 练习
- 汉语词汇与文化课件
- 浅析公路桥梁施工中高性能混凝土的应用
- 新概念英语第三册Lesson8 课件
评论
0/150
提交评论