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

上传人:b****2 文档编号:3459205 上传时间:2023-05-01 格式:DOCX 页数:31 大小:20.53KB
下载 相关 举报
操作系统实验文件管理C++代码Word下载.docx_第1页
第1页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第2页
第2页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第3页
第3页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第4页
第4页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第5页
第5页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第6页
第6页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第7页
第7页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第8页
第8页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第9页
第9页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第10页
第10页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第11页
第11页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第12页
第12页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第13页
第13页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第14页
第14页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第15页
第15页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第16页
第16页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第17页
第17页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第18页
第18页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第19页
第19页 / 共31页
操作系统实验文件管理C++代码Word下载.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

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;

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2