操作系统实验文件管理C++代码Word文件下载.docx
- 文档编号:21045472
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:27
- 大小:21.21KB
操作系统实验文件管理C++代码Word文件下载.docx
《操作系统实验文件管理C++代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验文件管理C++代码Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
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"
);
WARNING:
ALLDATAONTHISFILESYSTEMWILLBELOST!
\n"
ProceedwithFormat(Y/N)?
"
scanf("
%c"
&
choice);
getchar();
if((choice=='
y'
)||(choice=='
Y'
))
{
if((fp=fopen(image_name,"
w+b"
))==NULL)
Can'
tcreatefile%s\n"
image_name);
exit(-1);
}
for(i=0;
i<
BLKSIZE;
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;
31;
BLKNUM*BLKSIZE;
\0'
fclose(fp);
//打开文件user.txt
if((fp=fopen("
user.txt"
"
w+"
Filesystemcreatedsuccessful.Pleasefirstlogin!
return;
}
//功能:
用户登陆,如果是新用户则创建用户
voidlogin(void)
char*p;
intflag;
charfile_name[10]="
do
login:
gets(user_name);
password:
p=password;
while(*p=getch())
if(*p==0x0d)
*p='
//将输入的回车键转换成空格
break;
printf("
*"
//将输入的密码以"
号显示
p++;
flag=0;
if((fp=fopen(file_name,"
r+"
\nCan'
topenfile%s.\n"
file_name);
Thisfilesystemnotexist,itwillbecreate!
format();
login();
while(!
feof(fp))
fread(&
user,sizeof(User),1,fp);
//已经存在的用户,且密码正确
if(!
strcmp(user.user_name,user_name)&
&
!
strcmp(user.password,password))
//已经存在的用户,但密码错误
elseif(!
strcmp(user.user_name,user_name))
\nThisuserisexist,butpasswordisincorrect.\n"
flag=1;
if(flag==0)break;
}while(flag);
//创建新用户
if(flag==0)
\nDoyouwanttocreatanewuser?
(y/n):
gets(temp);
strcpy(user.user_name,user_name);
strcpy(user.password,password);
n'
N'
将所有i节点读入内存
voidinit(void)
if((fp=fopen(image_name,"
r+b"
//读入位图
BLKNUM;
bitmap[i]=fgetc(fp);
//显示位图
//读入i节点信息
INODENUM;
inode_array[i],sizeof(Inode),1,fp);
//显示i节点
//当前目录为根目录
inum_cur=0;
//初始化打开文件表
FILENUM;
file_array[i].inum=-1;
分析用户命令,将分析结果填充argc和argv
//结果:
0-13为系统命令,14为命令错误
intanalyse(char*str)
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!
='
ptr_char++)
if(*ptr_char!
'
)
while(*ptr_char!
&
(*ptr_char!
temp[i++]=*ptr_char++;
argv[argc]=(char*)malloc(i+1);
strncpy(argv[argc],temp,i);
argv[argc][i]='
argc++;
i=0;
if(*ptr_char=='
)break;
if(argc!
=0)
(i<
14)&
strcmp(argv[0],syscmd[i]);
i++);
returni;
else
return14;
将num号i节点保存到hd.dat
voidsave_inode(intnum)
topenfile%s\n"
fseek(fp,BLKNUM+num*sizeof(Inode),SEEK_SET);
inode_array[num],sizeof(Inode),1,fp);
申请一个数据块
intget_blknum(void)
if(bitmap[i]=='
//未找到空闲数据块
if(i==BLKNUM)
Dataareaisfull.\n"
bitmap[i]='
1'
fseek(fp,i,SEEK_SET);
将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];
fseek(fp,BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE,SEEK_SET);
ch=fgetc(fp);
for(i=0;
len)&
(ch!
)&
512);
temp[i]=ch;
if(i>
=512)
fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET);
for(;
temp[i]='
将temp的内容输入hd的数据区
voidwrite_blk(intnum)
fseek(fp,BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE,SEEK_SET);
(i<
len)&
(temp[i]!
='
)&
(i<
fputc(temp[i],fp);
if(i==512)
fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE,SEEK_SET);
(temp[i]!
释放文件块号为num的文件占用的空间
voidrelease_blk(intnum)
FILE*fp;
bitmap[num]='
fseek(fp,num,SEEK_SET);
显示帮助命令
voidhelp(void)
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
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;
[%s]$"
path);
切换目录(cd..或者cddir1)
voidcd(void)
=2)
Commandcdmusthavetwoargs.\n"
strcmp(argv[1],"
.."
inum_cur=inode_array[inum_cur].iparent;
if((inode_array[i].inum>
0)&
(inode_array[i].type=='
(inode_array[i].iparent==inum_cur)&
strcmp(inode_array[i].file_name,argv[1])&
strcmp(inode_array[i].user_name,user.user_name))
if(i==INODENUM)
Thisdirectoryisn'
texsited.\n"
inum_cur=i;
显示当前目录下的子目录和文件(dir)
voiddir(void)
intdcount=0,fcount=0;
shortbcount=0;
=1)
Commanddirmusthaveoneargs.\n"
//遍历i节点数组,显示当前目录下的子目录和文件名
0)&
(inode_array[i].iparent==inum_cur)&
!
if(inode_array[i].type=='
dcount++;
%-20s<
DIR>
inode_array[i].file_name);
else
fcount++;
bcount+=inode_array[i].length;
%-20s%12dbytes\n"
inode_array[i].file_name,inode_array[i].length);
\n%dfile(s)%11dbytes\n"
fcount,bcount);
%ddir(s)%11dbytesFreeSpace\n"
dcount,1024*1024-bcount);
在当前目录下创建子目录(mkdirdir1)
voidmkdir(void)
commandmkdirmusthavetwoargs.\n"
//遍历i节点数组,查找未用的i节点
if(inode_array[i].inum<
0)break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 文件 管理 C+ 代码