操作系统实验文件管理C++代码.docx

上传人:b****7 文档编号:9452784 上传时间:2023-02-04 格式:DOCX 页数:31 大小:20.67KB
下载 相关 举报
操作系统实验文件管理C++代码.docx_第1页
第1页 / 共31页
操作系统实验文件管理C++代码.docx_第2页
第2页 / 共31页
操作系统实验文件管理C++代码.docx_第3页
第3页 / 共31页
操作系统实验文件管理C++代码.docx_第4页
第4页 / 共31页
操作系统实验文件管理C++代码.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

操作系统实验文件管理C++代码.docx

《操作系统实验文件管理C++代码.docx》由会员分享,可在线阅读,更多相关《操作系统实验文件管理C++代码.docx(31页珍藏版)》请在冰豆网上搜索。

操作系统实验文件管理C++代码.docx

操作系统实验文件管理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

\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;i

if(inode_array[i].inum<0)b

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1