《操作系统实验文件管理c++代码》由会员分享,可在线阅读,更多相关《操作系统实验文件管理c++代码(19页珍藏版)》请在金锄头文库上搜索。
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
2、 inum; / 文件 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;/ 申明函数voi
3、d login(void);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(vo
4、id);void write(void);void close(void);void delet(void);void logout(void);void command(void);void quit();/main.cpp 文件/#include head.h/定义全局变量 char choice;int argc; / 用户命令的参数个数char *argv5; / 用户命令的参数int inum_cur; / 当前目录char temp2*BLKSIZE; / 缓冲区User user; / 当前的用户char bitmapBLKNUM; / 位图数组Inode inode_array
5、INODENUM; / i 节点数组File_table file_arrayFILENUM; / 打开文件表数组char image_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)?);
6、scanf(%c, getchar(); if(choice = y) | (choice = Y)if(fp=fopen(image_name, w+b) = NULL)printf(Cant create file %sn, image_name);exit(-1);for(i = 0; i 512)add1 = inode_arraynum.address1;if(fp = fopen(image_name, r+b) = NULL)printf(Cant open file %s.n, image_name);exit(-1);fseek(fp, BLKSIZE+INODESIZE*I
7、NODENUM +add0*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(i=0; (i = 512)fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(; (i 0)&(inode_arrayi.type=d)&(inode_arrayi.iparent=inum_cur)& !strcmp(inode_arrayi.file_name,argv1)&!strcmp(inode_arrayi.user_name,user.user_name)break;if
8、(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_arrayi.iparent = inum_cur)&!st
9、rcmp(inode_arrayi.user_name,user.user_name)if(inode_arrayi.type = d)dcount+;printf(%-20sn, inode_arrayi.file_name);elsefcount+;bcount+=inode_arrayi.length;printf(%-20s%12d bytesn, inode_arrayi.file_name,inode_arrayi.length);printf(n %d file(s)%11d bytesn,fcount,bcount);printf( %d dir(s) %11d bytes F
10、reeSpacen,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 0) &(inode_arrayi.type = f) &!strcmp(inode_arrayi.file_name, argv1)printf(This file is exsit.n);return ;for(i =
11、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, getchar();i
12、f(mode 3)printf(Open mode is wrong.n);return;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_arrayin
13、um.length);if(inode_arrayinum.length 0)read_blk(inum);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 = 1)printf(Cant write %s.n, argv1);return ;inum = file_arrayi.inum;printf(The length of %s:%dn, inode_array
14、inum.file_name, inode_arrayinum.length);if(inode_arrayinum.length = 0)i=0;inode_arrayinum.address0 = get_blknum();printf(Input the data(CTRL+Z to end):n);while(i 512)inode_arrayinum.address1 = get_blknum();save_inode(inum);write_blk(inum);elseprintf(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) if(i = FILENUM)printf(This file doesnt be opened.n);return ;else file_arrayi.inum = -1;