操作系统实验文件管理C++代码.docx
- 文档编号:11821516
- 上传时间:2023-04-03
- 格式:DOCX
- 页数:27
- 大小:20.49KB
操作系统实验文件管理C++代码.docx
《操作系统实验文件管理C++代码.docx》由会员分享,可在线阅读,更多相关《操作系统实验文件管理C++代码.docx(27页珍藏版)》请在冰豆网上搜索。
操作系统实验文件管理C++代码
#include
#include
#include
#include
#include
usingnamespacestd;
#defineBLKSIZE512//数据块的大小
#defineBLKNUM512//数据块的块数
#defineINODESIZE32//i节点的大小
#defineINODENUM32//i节点的数目
#defineFILENUM8//打开文件表的数目
//用户
typedefstruct
{
charuser_name[10];//用户名
charpassword[10];//密码
}User;
//i节点
typedefstruct
{
shortinum;//文件i节点号
charfile_name[10];//文件名
chartype;//文件类型
charuser_name[10];//文件所有者
shortiparent;//父目录的i节点号
shortlength;//文件长度
shortaddress[2];//存放文件的地址
}Inode;
//打开文件表
typedefstruct
{
shortinum;//i节点号
charfile_name[10];//文件名
shortmode;//读写模式(1:
read,2:
write,
//3:
readandwrite)
}File_table;
//申明函数
voidlogin(void);
voidinit(void);
intanalyse(char*);
voidsave_inode(int);
intget_blknum(void);
voidread_blk(int);
voidwrite_blk(int);
voidrelease_blk(int);
voidpathset();
voiddel(int);
//用户命令处理函数
voidhelp(void);
voidcd(void);
voiddir(void);
voidmkdir(void);
voidcreat(void);
voidopen(void);
voidread(void);
voidwrite(void);
voidclose(void);
voiddelet(void);
voidlogout(void);
voidcommand(void);
voidquit();
//main.cpp文件
//#include"head.h"
//定义全局变量
charchoice;
intargc;//用户命令的参数个数
char*argv[5];//用户命令的参数
intinum_cur;//当前目录
chartemp[2*BLKSIZE];//缓冲区
Useruser;//当前的用户
charbitmap[BLKNUM];//位图数组
Inodeinode_array[INODENUM];//i节点数组
File_tablefile_array[FILENUM];//打开文件表数组
charimage_name[10]="data.dat";//文件系统名称
FILE*fp;//打开文件指针
//创建映像hd,并将所有用户和文件清除
voidformat(void)
{
inti;
Inodeinode;
printf("Willbetoformatfilesystem...\n");
printf("WARNING:
ALLDATAONTHISFILESYSTEMWILLBELOST!
\n");
printf("ProceedwithFormat(Y/N)?
");
scanf("%c",&choice);
getchar();
if((choice=='y')||(choice=='Y'))
{
if((fp=fopen(image_name,"w+b"))==NULL)
{
printf("Can'tcreatefile%s\n",image_name);
exit(-1);
}
for(i=0;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.address[0]=-1; inode.address[1]=-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 fputc('\0',fp); fclose(fp); //打开文件user.txt if((fp=fopen("user.txt","w+"))==NULL) { printf("Can'tcreatefile%s\n","user.txt"); exit(-1); } fclose(fp); printf("Filesystemcreatedsuccessful.Pleasefirstlogin! \n"); } return; } //功能: 用户登陆,如果是新用户则创建用户 voidlogin(void) { char*p; intflag; charuser_name[10]; charpassword[10]; charfile_name[10]="user.txt"; do { printf("login: "); gets(user_name); printf("password: "); p=password; while(*p=getch()) { if(*p==0x0d) { *p='\0';//将输入的回车键转换成空格 break; } printf("*");//将输入的密码以"*"号显示 p++; } flag=0; if((fp=fopen(file_name,"r+"))==NULL) { printf("\nCan'topenfile%s.\n",file_name); printf("Thisfilesystemnotexist,itwillbecreate! \n"); format(); login(); } while(! feof(fp)) { fread(&user,sizeof(User),1,fp); //已经存在的用户,且密码正确 if(! strcmp(user.user_name,user_name)&& ! strcmp(user.password,password)) { fclose(fp); printf("\n"); return; } //已经存在的用户,但密码错误 elseif(! strcmp(user.user_name,user_name)) { printf("\nThisuserisexist,butpasswordisincorrect.\n"); flag=1; fclose(fp); break; } } if(flag==0)break; }while(flag); //创建新用户 if(flag==0) { printf("\nDoyouwanttocreatanewuser? (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节点读入内存 voidinit(void) { inti; if((fp=fopen(image_name,"r+b"))==NULL) { printf("Can'topenfile%s.\n",image_name); exit(-1); } //读入位图 for(i=0;i bitmap[i]=fgetc(fp); //显示位图 //读入i节点信息 for(i=0;i fread(&inode_array[i],sizeof(Inode),1,fp); //显示i节点 //当前目录为根目录 inum_cur=0; //初始化打开文件表 for(i=0;i file_array[i].inum=-1; } //功能: 分析用户命令,将分析结果填充argc和argv //结果: 0-13为系统命令,14为命令错误 intanalyse(char*str) { inti; chartemp[20]; 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(*ptr_char! =''&&(*ptr_char! ='\0')) temp[i++]=*ptr_char++; argv[argc]=(char*)malloc(i+1); strncpy(argv[argc],temp,i); argv[argc][i]='\0'; argc++; i=0; if(*ptr_char=='\0')break; } } if(argc! =0) { for(i=0;(i<14)&&strcmp(argv[0],syscmd[i]);i++); returni; } else return14; } //功能: 将num号i节点保存到hd.dat voidsave_inode(intnum) { if((fp=fopen(image_name,"r+b"))==NULL) { printf("Can'topenfile%s\n",image_name); exit(-1); } fseek(fp,BLKNUM+num*sizeof(Inode),SEEK_SET); fwrite(&inode_array[num],sizeof(Inode),1,fp); fclose(fp); } //功能: 申请一个数据块 intget_blknum(void) { inti; for(i=0;i if(bitmap[i]=='0')break; //未找到空闲数据块 if(i==BLKNUM) { printf("Dataareaisfull.\n"); exit(-1); } bitmap[i]='1'; if((fp=fopen(image_name,"r+b"))==NULL) { printf("Can'topenfile%s\n",image_name); exit(-1); } fseek(fp,i,SEEK_SET); fputc('1',fp); fclose(fp); returni; } //功能: 将i节点号为num的文件读入temp voidread_blk(intnum) { inti,len; charch; intadd0,add1; len=inode_array[num].length; add0=inode_array[num].address[0]; if(len>512) add1=inode_array[num].address[1]; if((fp=fopen(image_name,"r+b"))==NULL) { printf("Can'topenfile%s.\n",image_name); exit(-1); } fseek(fp,BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE,SEEK_SET); ch=fgetc(fp); for(i=0;(i ='\0')&&(i<512);i++) { temp[i]=ch; ch=fgetc(fp); } if(i>=512) { fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET); ch=fgetc(fp); for(;(i ='\0');i++) { temp[i]=ch; ch=fgetc(fp); } } temp[i]='\0'; fclose(fp); } //功能: 将temp的内容输入hd的数据区 voidwrite_blk(intnum) { inti,len; intadd0,add1; add0=inode_array[num].address[0]; len=inode_array[num].length; if((fp=fopen(image_name,"r+b"))==NULL) { printf("Can'topenfile%s.\n",image_name); exit(-1); } fseek(fp,BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE,SEEK_SET); for(i=0;(i ='\0')&&(i<512);i++) fputc(temp[i],fp); if(i==512) { add1=inode_array[num].address[1]; fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET); for(;(i ='\0');i++) fputc(temp[i],fp); } fputc('\0',fp); fclose(fp); } //功能: 释放文件块号为num的文件占用的空间 voidrelease_blk(intnum) { FILE*fp; if((fp=fopen(image_name,"r+b"))==NULL) { printf("Can'topenfile%s\n",image_name); exit(-1); } bitmap[num]='0'; fseek(fp,num,SEEK_SET); fputc('0',fp); fclose(fp); } //功能: 显示帮助命令 voidhelp(void) { printf("command: \n\ help---showhelpmenu\n\ clear---clearthescreen\n\ cd---changedirectory\n\ mkdir---makedirectory\n\ create---createanewfile\n\ open---openaexistfile\n\ read---readafile\n\ write---writesomethingtoafile\n\ close---closeafile\n\ delet---deleteaexistfileordirectory\n\ format---formataexistfilesystem\n\ logout---exituser\n\ quit---exitthissystem\n"); } //设置文件路径 voidpathset() { charpath[50]; intm,n; if(inode_array[inum_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_array[n].iparent! =m) { n=inode_array[n].iparent; } strcat(path,"/"); strcat(path,inode_array[n].file_name); m=n; n=inum_cur; } } printf("[%s]$",path); } //功能: 切换目录(cd..或者cddir1) voidcd(void) { inti; if(argc! =2) { printf("Commandcdmusthavetwoargs.\n"); return; } if(! strcmp(argv[1],"..")) inum_cur=inode_array[inum_cur].iparent; else { for(i=0;i if((inode_array[i].inum>0)&& (inode_array[i].type=='d')&& (inode_array[i].iparent==inum_cur)&& ! strcmp(inode_array[i].file_name,argv[1])&& ! strcmp(inode_array[i].user_name,user.user_name)) break; if(i==INODENUM) printf("Thisdirectoryisn'texsited.\n"); else inum_cur=i; } } //功能: 显示当前目录下的子目录和文件(dir) voiddir(void) { inti; intdcount=0,fcount=0; shortbcount=0; if(argc! =1) { printf("Commanddirmusthaveoneargs.\n"); return; } //遍历i节点数组,显示当前目录下的子目录和文件名 for(i=0;i if((inode_array[i].inum>0)&& (inode_array[i].iparent==inum_cur)&& ! strcmp(inode_array[i].user_name,user.user_name)) { if(inode_array[i].type=='d') { dcount++; printf("%-20s } else { fcount++; bcount+=inode_array[i].length; printf("%-20s%12dbytes\n",inode_array[i].file_name,inode_array[i].length); } } printf("\n%dfile(s)%11dbytes\n",fcount,bcount); printf("%ddir(s)%11dbytesFreeSpace\n",dcount,1024*1024-bcount); } //功能: 在当前目录下创建子目录(mkdirdir1) voidmkdir(void) { inti; if(argc! =2) { printf("commandmkdirmusthavetwoargs.\n"); return; } //遍历i节点数组,查找未用的i节点 for(i=0;i if(inode_array[i].inum<0)brea
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 文件 管理 C+ 代码