操作系统实验文件管理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;ifputc('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;ifputc('\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;ibitmap[i]=fgetc(fp);
//显示位图
//读入i节点信息
for(i=0;ifread(&inode_array[i],sizeof(Inode),1,fp);
//显示i节点
//当前目录为根目录
inum_cur=0;
//初始化打开文件表
for(i=0;ifile_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;iif(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;iif((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;iif((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
\n",inode_array[i].file_name);
}
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;iif(inode_array[i].inum<0)brea