操作系统实验文件管理C++代码_第1页
操作系统实验文件管理C++代码_第2页
操作系统实验文件管理C++代码_第3页
操作系统实验文件管理C++代码_第4页
操作系统实验文件管理C++代码_第5页
免费预览已结束,剩余32页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include<stack>/ 数据块的大小/ 数据块的块数/ i 节点的大小/ i 节点的数目/ 打开文件表的数目using namespace std; #define BLKSIZE 512 #define BLKNUM 512 #define INODESIZE 32 #define INODENUM 32 #define FILENUM 8/ 用户typedef struct/ 用户名/ 密码char user_name10;char password10; User;/i 节点typedef struct文件 i 节点号文件名文件类型 文件所有者 父目录的 i 节点号

2、 文件长度short inum; /char file_name10; / char type; /char user_name10; / short iparent;/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);void init(void); int a

3、nalyse(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 write(void);void clos

4、e(void);void delet(void);void logout(void);void command(void);void quit();/main.cpp 文件/#include "head.h"/ 定义全局变量char choice;int argc; / 用户命令的参数个数 char *argv5;/ 用户命令的参数intinum_cur;/ 当前目录char temp2*BLKSIZE; / 缓冲区char bitmapBLKNUM; / 位图数组Inode inode_arrayINODENUM; / i 节点数组File_table file_arra

5、yFILENUM;/ 打开文件表数组文件系统名称FILE*fp;/ 打开文件指针char image_name10 = "data.dat" /创建映像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)"

6、);scanf("%c", &choice);getchar();if(choice = 'y') | (choice = 'Y')if(fp=fopen(image_name, "w+b") = NULL)printf("Can't create file %sn", image_name);exit(-1);for(i = 0; i < BLKSIZE; i+) fputc('0', fp);inode.inum = 0;strcpy(inode.file_na

7、me, "/");inode.type = 'd'strcpy(inode.user_name, "/");inode.iparent = 0;inode.length = 0;inode.address0 = -1;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 < B

8、LKNUM*BLKSIZE; i+) fputc('0', fp);fclose(fp);/ 打开文件 user.txtif(fp=fopen("user.txt", "w+") = NULL)printf("Can't create file %sn", "user.txt"); exit(-1);fclose(fp);successful.Pleasefirstprintf("Filesystem created login!n");return ;/ 功能 : 用户

9、登陆,如果是新用户则创建用户void login(void)char *p;int flag;char user_name10;char password10;char file_name10 = "user.txt"doprintf("login:");gets(user_name);printf("password:");p=password;while(*p=getch()if(*p = 0x0d)*p='0' / 将输入的回车键转换成空格break;printf("*"); / 将输入的密码

10、以 "*" 号显示p+;flag = 0;if(fp = fopen(file_name, "r+") = NULL)printf("nCan't 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

11、(user.user_name, user_name) &&!strcmp(user.password, password)fclose(fp);printf("n");return ;/ 已经存在的用户 , 但密码错误else if(!strcmp(user.user_name, user_name)password isprintf("nThis user is exist, but incorrect.n");flag = 1;fclose(fp);break;if(flag = 0) break;while(flag);/ 创建新

12、用户if(flag = 0)printf("nDo you want to creat 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(choic

13、e = 'n') | (choice = 'N')login();/ 功能 : 将所有 i 节点读入内存void init(void)int i;if(fp = fopen(image_name, "r+b") = NULL)printf("Can't open file %s.n", image_name);exit(-1);/ 读入位图for(i = 0; i < BLKNUM; i+)bitmapi = fgetc(fp);/ 显示位图/ 读入 i 节点信息for(i = 0; i < INODE

14、NUM; i+)fread(&inode_arrayi, sizeof(Inode), 1, fp);/ 显示 i 节点/ 当前目录为根目录inum_cur = 0;/ 初始化打开文件表for(i = 0; i < FILENUM; i+)file_arrayi.inum = -1;/ 功能 : 分析用户命令 , 将分析结果填充 argc 和 argv/ 结果: 0-13 为系统命令 , 14 为命令错误int analyse(char *str)int i;char temp20;char *ptr_char;char *syscmd="help", &qu

15、ot;cd", "dir", "mkdir", "create", "open", "read", "write","logout","close", "delet", "clear","format","quit"argc = 0;for(i = 0, ptr_char = str; *ptr_char != '0' ptr_ch

16、ar+)if(*ptr_char != ' ')while(*ptr_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

17、(argv0, syscmdi); i+);return i;elsereturn 14;/功能:将num号i节点保存到hd.datvoid save_inode(int num)if(fp=fopen(image_name, "r+b") = NULL)printf("Can't open file %sn", image_name); exit(-1);fseek(fp, BLKNUM +num*sizeof(Inode), SEEK_SET);fwrite(&inode_arraynum, sizeof(Inode), 1, fp)

18、; fclose(fp);/ 功能: 申请一个数据块int get_blknum(void)int i;for(i = 0; i < BLKNUM; i+)if(bitmapi = '0') break;/ 未找到空闲数据块if(i = BLKNUM)printf("Data area is full.n");exit(-1);bitmapi = '1'if(fp=fopen(image_name, "r+b") = NULL)printf("Can't open file %sn", i

19、mage_name);exit(-1);fseek(fp, i, SEEK_SET);fputc('1', fp);fclose(fp);return i;/功能:将i节点号为num的文件读入tempvoid read_blk(int num)int i, len;char ch;int add0, add1;len = inode_arraynum.length;add0 = inode_arraynum.address0;if(len > 512)add1 = inode_arraynum.address1;if(fp = fopen(image_name, &quo

20、t;r+b") = NULL)printf("Can't 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); i+)tempi = ch;ch = fgetc(fp);if(i >= 512) fseek(fp,BLKS

21、IZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET);ch = fgetc(fp);for(; (i < len) && (ch != '0'); i+)tempi = ch;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.l

22、ength;if(fp = fopen(image_name, "r+b") = NULL)printf("Can't open file %s.n", image_name);exit(-1);fseek(fp, BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE, SEEK_SET);for(i=0; (i<len)&&(tempi!='0')&&(i < 512); i+)fputc(tempi, fp);if(i = 512)add1 = inode_

23、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(int num)FILE *fp;if(fp=fopen(image_name, "r+b") = NULL)printf(&q

24、uot;Can't open file %sn", image_name);exit(-1);bitmapnum = '0'fseek(fp, num, SEEK_SET);fputc('0', fp);fclose(fp);/ 功能 : 显示帮助命令void help(void)printf("command: nhelp - show help menu nclear - clear the screen ncd - change directory n mkdir - make directory n create - crea

25、te a new file n open - open a exist file n read - read a file nwrite - write something to a file n close - close a file ndelet - delete a exist file or directory n format - format a exist filesystem n logout - exit user nquit - exit this systemn");/ 设置文件路径void pathset()char path50;int m,n;if(in

26、ode_arrayinum_cur.inum = 0) strcpy(path,user.user_name);elsestrcpy(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);/ 功能: 切换目

27、录 (cd . 或者 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;elsefor(i = 0; i < INODENUM; i+) if(inode_arrayi.inum>0)&&(inode_arrayi.type='d')&&(in

28、ode_arrayi.iparent=inum_cur)&& !strcmp(inode_arrayi.file_name,argv1)&&!strcmp(inode_arrayi.user_name,user.use r_name)break;if(i = INODENUM)printf("This directory isn't exsited.n");elseinum_cur = i;/ 功能 : 显示当前目录下的子目录和文件 (dir)void dir(void)int i;int dcount=0,fcount=0;shor

29、t bcount=0;if(argc != 1)printf("Command dir must have one args. n");return ;/ 遍历 i 节点数组 , 显示当前目录下的子目录和文件名 for(i = 0; i < INODENUM; i+)if(inode_arrayi.inum> 0) && (inode_arrayi.iparent = inum_cur)&&!strcmp(inode_arrayi.user_name,user.user_name) if(inode_arrayi.type = &

30、#39;d') dcount+;printf("%-20s<DIR>n", inode_arrayi.file_name);else fcount+;bytesn",bcount+=inode_arrayi.length; printf("%-20s%12dinode_arrayi.file_name,inode_arrayi.length);printf("n%d file(s)%11dbytesn",fcount,bcount);printf(" %d dir(s) %11d bytes FreeSp

31、acen",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 full.n&

32、quot;);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(&quo

33、t;command creat must have two args. n");return ;for(i = 0; i < INODENUM; i+)if(inode_arrayi.inum > 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_array

34、i.inum < 0) break;if(i = INODENUM)printf("Inode is full.n");exit(-1);inode_arrayi.inum = i;strcpy(inode_arrayi.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);/ 功能: 打开当前

35、目录下的文件 (open file1)void open()int i, inum, mode, filenum;if(argc != 2)printf("command open must have two args. n");return ;for(i = 0; i < INODENUM; i+)if(inode_arrayi.inum > 0) &&(inode_arrayi.type = 'f') &&!strcmp(inode_arrayi.file_name,argv1)&&!strcm

36、p(inode_arrayi.user_name,user.user_name)break;if(i = INODENUM)printf("The file you want to open doesn't exsited.n");return ;inum = i;andprintf("Please input open mode:(1: read, 2: write, 3: readwrite):");scanf("%d", &mode);getchar();if(mode < 1) | (mode >

37、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.f

38、ile_name);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(ar

39、gc != 2)printf("command read must have two args. n");return;for(i = 0; i < FILENUM; i+)if(file_arrayi.inum > 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("Can't

40、read %s.n", argv1);return ;inum = file_arrayi.inum;printf("The length of %s:%d.n", argv1, inode_arrayinum.length); if(inode_arrayinum.length > 0)read_blk(inum);for(i = 0; (i < inode_arrayinum.length) && (tempi != '0'); i+)printf("%c", tempi);/ 功能: 向文件中写

41、入字符 (write file1)void write()int i, inum, length;if(argc != 2)printf("Command write must have two args. n");return ;for(i = 0; i < FILENUM; i+)if(file_arrayi.inum>0)&&!strcmp(file_arrayi.file_name,argv1) break;if(i = FILENUM)printf("Open %s first.n", argv1);return ;

42、else if(file_arrayi.mode = 1)printf("Can't 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("Input the da

43、ta(CTRL+Z to end):n"); while(i<1023&&(tempi=getchar()!=EOF) i+;tempi='0'length=strlen(temp)+1;inode_arrayinum.length=length;if(length > 512)inode_arrayinum.address1 = get_blknum(); save_inode(inum);write_blk(inum);elseprintf("This file can't be written.n");/

44、功能: 关闭已经打开的文件 (close file1)void close(void)int i;if(argc != 2)printf("Command close must have two args. n");return ;for(i = 0; i < FILENUM; i+)if(file_arrayi.inum > 0) &&!strcmp(file_arrayi.file_name, argv1) break;if(i = FILENUM)printf("This file doesn't be opened.n&

45、quot;); return ;elsefile_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);/ 删除子目录树

46、和文件void delet(void)if(argc != 2)printf("Command delete must have two args. n");return ;int n,t,i;stack<int> istk;for(i = 0; i < INODENUM; i+)/查找待删除子目录if(inode_arrayi.inum >=0) &&(inode_arrayi.iparent = inum_cur)&& (!strcmp(inode_arrayi.file_name,argv1)&&(!strcmp(inode_arrayi.user_name,user.user_name) n=inode_arrayi.inum;break;if(i=INODENUM) puts("Directory ERROR");elseistk.push(n);while(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论