




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华南理工大学软件学院
2013级操作系统大作业实验报告
课程名称:操作系统___________
任课老师:_____________________
作业题目:简单二级文件系统
班级:_____________________
学生姓名:_____________________
学号:
目录
1.实验目的
2.实验环境
3.实验内容
4.程序中使用的数据结构及符号说明
5.源程序及注释
6.程序运行时的初值和运行结果
一、实验目的
通过一个简单多用户义件系统的设计,加深理解义件系统的内部功能及内部实现。
二、实验环境
操作系统:Ubuntu12.04(Ubuntu/Linaro4.6.3-lubuntu5)
编译器:gcc4.6.3
语言:C语言
三、实验内容
FMSV1.0系统模拟了原生的文件系统,使用文本来当作磁盘,并使用了空
闲块记录表,目录,i-node等数据结构来辅助文件系统的运作。
磁盘:一个名为blockDisk的文件,里面含有256个数据块。每个数据块
的长度为1024,可存储1024个字符。
I节点:包含文件名,文件保护码,文件长度,文件存放位置。
目录:一个链表,记录了i节点。
空闲块记录表FBT:用于记录磁盘块使用情况,0表示未使用,1表示使
用。
数据块:保存了文件的数据,一个数据块至多存放一个文件。
数据块使用情况:用于记录文件使用数据块的情况。存放在I节点的fat
数组中。
文件:一个文件最多占用两个数据块,即长度至多为4028.
FMSV1.0系统支持的命令行:
login:登录
register:注册
open:翻开文件
read:读取文件数据到屏幕
write:写文件,分为cover和append两种类型;cover是覆盖原数据,
append是在不改变原始数据的根底上进行增加。
close:关闭文件
create:新增文件
delete:删除文件
exit:退出程序
help:帮助
四、程序中使用的数据结构及符号说明
/X----------结构定义------------*/
/*------用户-----*/
typedefstructuser
(
characcount[15];〃账户最长为10
charpassword[l5];〃密码最长为10,多出来的是为了
方便运算
}user;
/X-----数据节点-----*/
typedefstructdatanode//用于记录文件数据保存在哪个数据块的
哪个范围
(
intnum;〃数据块号
inibegin;〃数据开始位置
intend;〃数据结束位置
}datanode;
/x------i节点-----*/
typedefstructinode
(
Charfilename[301;
Intnum;
charcode[30];〃保护码
intsize;
datanodefat[MAX_DATANODE_NUM];
intnode_num;
}inode;
typedefstructdirEntry//用链表来记录I节点
(
inodeind;
structdirEntry*next;
[dirEntry;
/X----数据块-----*/
typedefstructblock
charuuiilenl[MAX_BLOCK_SIZE];〃数据块内容最大长度为
1025,预留最后一位用来存储'\0',
intnum;
intoffset;〃记录当前数据的数量
[block;
五、源程序及注释
head.h头文件
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#defineMAX_BLOCKS_NUM256〃最大数据块数量是256,那么
数据块总大小是256KB
#defineMAX_BLOCK_SIZE1025〃数据块数据容量,一个数据块
的大小是1KB,最有1位用来存储表示字符串结尾!
#defineMAX_DATANODE_NUM2〃每个文件最多占用的数据块
的数量
#defineMAXJNODE_NUM512//i节点的最大数目,亦即系统
允许容纳文件的最大数量
#defineMAX_CACHE_NUM32〃允许缓存的最大数据块数量
为32个数据块,缓存为32KB
结构定义*/
/*------用户-----*/
typcdefstructuser
(
characcount[15];〃账户最长为10
charpassword[15];〃密码最长为10,多出来的是为
了方便运算
}user;
/*-----数据节点-----*/
typedefstructdatanode〃用于记录文件数据保存在哪个数据块
的哪个范围
intnum;〃数据块号
intbegin;〃数据开始位置
intend;〃数据结束位置
}datanode;
/*------i节点-----*/
typedefstructinode
charfilename[3()];
intnum;
charcode|30];〃保护码
intsize;
datanodefat[MAX_DATANODE_NUM];
intnode_num;
}inode;
typedefstructdirEntry〃用链表来记录I节点
(
inodeind;
structdirEntry*next;
}dirEntry;
/*----数据块-----*/
typedefstructblock
(
charcontent[MAX_BLOCK_SIZE];〃数据块内容最大长度
为1024
intnum;
boolisRevised;〃用于记录数据块是否进行
数据修改
intoffset;〃记录当前数据的数量
}block;
/*--------定义全局变量-------------*/
intislogin=0;//()meansthe
charblockspath|30|=*,userdata/blocksDISK.diskn;//所有数据(即虚拟磁
盘)地址
charuserspath[30]=nuserdata/users.usn;
staticusercurrUser;〃当前用户
staticdirEntry*DIR;
staticintcurr_inode_num=0;//当前i节点数量,亦即文
件数量
staticblock*cache;
intmax_node=0;//最大的inode编号
staticintFBT[MAX_BLOCKS_NUM];
staticchar*dirpath;
staticcharIblpath[30]="userdata/FBT.disk";
staticdirEntry*selectEntry;〃当se!ectEntry==NULL时,证明没有翻
开文件
staticdirEntry*currEntry;
〃命令行
staticcharcm_help[10]="help";
staticcharcm_lg[10]="login1';
staticcharcm_rg[10]=nregister*';
staticcharcm_dir[10]="dir";
staticcharcm_create[10]="create0;
staticcharcm_delete[10]="delete”;
staticcharcm_open[10]="open";
staticcharcm_read[10]="read";
staticcharcm_write[10]="write";
staticcharcm_close[10]="close";
staticcharcm_exit[10]="exit";
staticcharcm_cancle[10]="cancle";
函数声明*/
voidcreateStyle(int,char);
voidcreateWrap(int);
intcreateSystem();
intdiskUpdate(block);
voidstart();
voidgetUser();
intlogin();
intregist();
charIgOrRgO;
voidcreateBlocksDisk();
FILE*createDir();
voidinitDir(char*);
intgetAction();
voidinitFBT();//初始化数据空闲块记录表
intgetCode();
intgetFreeBlock(bool);
voidsaveDir();
voidsaveBlock(blockbk);
voidsaveFBT();
intcreateHelp(char*filename);
dirEntry*delHelp(char*filename);
voidurealeDalaDir();
〃响应指令的函数
intLgRg();〃登录或注册
voidhelp();
voiddir();
voidcreate();
voiddel();
voidopen();
voidclose();
voidread();
voidwrite();
voidcoverHelpO;
voidappendHelpO;
//Linuxdoesn'tsupportthefunctionstrcmpi,soIneedtofinishitbymyself.
intstrcmpi(char*pl,char*p2)
if(strlen(p1)!=strlen(p2))
return-1;
)
inti;
for(i=0;i<strlen(pl);i++)
(
if(pl[i!!=p2[i]i
(
return-1;
)
)
return0;
)
voidcreateDataDir()
(
char*datapath="userdata";
printf("NodataDir!\nNowcreateit...\n");
if(mkdir(datapath,0777))
(
printf("CannotcreateDataDir..AnPleasecontactQQ87863I510for
help...\nCrtl+CtoexitAn'*);
while(l);
printf("SucceedcreatingdataDir!\nH);
)
voidshowlnode(inodeind)
(
printf("num:%d\nM,ind.num);
printf(Mfilename:%s\nM,ind.filename);
printf(nsize:%d\n",ind.size);
)
〃界面美化函数
voidcreateStyle(intnum,charstyle)
(
while(num—)
{
pnntf(u%cn,style);
)
)
voidcreateWrap(intn)
while(n—)
printf("\n");
)
)
〃辅助函数
charIgOrRgO
{
while(l)
|
charcom[l()];
printf("[login]or[register]:
scanf(n%s",com);
if(!strcmpi(com,cm_lg))
(
returnT;
)
if(!strcmp(com,cm_rg))
return'r';
voidhelp()
printf(”欢送您使用FMS文件系统模拟系统V1.011);
printf("以下是本系统支持的指令:\n");
printf(Hexit:退出\n”);
printf(nhelp:帮助\n”);
printf(ndir:查看目录中的所有文件\n");
printf("create:新建文件\n");
printf("delete:删除文件\n");
printf(nopen:翻开文件\n”);
printf(nread:读文件〔必须先翻开文件〕\nH);
printf(Mwrite:写文件〔必须先翻开文件〕\n”);
printf(nclose:关闭文件\n");
voidcreateBlocksDisk()
(
〃初始化磁盘块
FILE*fp=fopen(blockspath,Mw");
if(fp==NULL)
printf("CannotcreateDisk!\nCtrl+Ctoquit\n");
while(l);
)
else
(
inti,j;
for(i=0;i<MAX_BLOCKS_NUM;i++)
(
for(j=0;j<MAX_BLOCK_SIZE;j++)
{
fputc('$,,fp);
)
)
fclose(fp);
)
FILE*p=fopen(fbtpath,"w");
if(p==NULL)
{
printf("FBTCreatedERROR!\nn);
while(l);
else
inti;
for(i=0;i<MAX_BLOCKS_NUM;i++)
(
FBT[i]=0;
fprintf(p,n%du,0);
)
fclose(p);
)
)
dirEntry*isInDir(char*filename)
(
inti;
dirEntry*pt=DIR;
while(pt!=NULL)
(
if(!strcmpi(pt->ind.filename,filename))
(
returnpt;
)
pt=pt->next;
returnNULL;
dirEntry*delHelp(char*filename)
dirEntry*res=DIR;
if(res==NULL)
printf("Nofiles!\nH);
returnres;
}
if(res->next==NULL)
if(!strcmpi(res->ind.filename,filename))
DIR=NULL;
currEntry=NULL;
printf("删除成功!\n");
returnres;
)
else
returnNULL;
if(!strcmpi(res->ind.filename,filename))
DIR=res->next;
printf("删除成功!\n");
returnres;
)
while(res->next!=NULL)
(
if(!strcmpi(res->next->ind.filename,filename))
(
dirEntry*r=res->next;
res->next=r->next;
printf("删除成功!\n“);
returnr;
)
res=res->next;
)
printf("删除失败!出)
returnNULL;
voidcoverHelpO
〃释放原数据块,更新FBT
intf;
if(selectEntry->ind.size!=O)〃要size>0才会分配数据块
(
for(f=0;f<selectEntry->ind.node_num;f++)
(
FBT[selectEntry->ind.fat[f].num]==O;
)
)
charcontentlMAX_DATANODE_NUM]lMAX_BLOCK_SIZEJ;
chartmp;
inodeind;
printf(MEndwith$\n“);
inti=0;
while((tmp=getchar())!='$')
{
if(i==0&&tmp==,\n,)
(
continue;
uuiilenl[i/MAX_BLOCK_SIZE][i++]=imp;
ind.size=i;
〃此时已经结束输入
if(i>(MAX_BLOCK_SIZE-1)*MAX_DATANODE_NUM)
(
printf("文件过大,无法存储,创立失败!\n”);
return;
)
intk;
for(k=();k<=i/(MAX_BLOCK_SIZE-1);k++)
{
blockbk;
intbkn;
for(bkn=0;bkn<MAX_BLOCK_SIZE-1;bkn++)
(
bk.content[bkn]='$';
)
bk.content[MAX_BLOCK_SIZE-1]='\()';
//printf(Hbk.content:%s\n",bk.content);
char*tmp;
inttp=O;
intlen=0;
if(k==O)
if(i<MAX_BLOCK_SIZE-1)
len=i;
)
)
if(k==l)
(
len=i%(MAX_BLOCK_SIZE-1)+1;
)
for(tp=0;tp<len;tp++)
(
bk.content|tp]=contentfk][tp];
)
bk.isRevised=true;
if(k==O)
(
bk.num=getFreeBlock(false);
)
else
(
bk.num=getFreeBlock(true);
if(bk.uuin==-l)
printf。数据块已用完,内存缺乏!\n“);
return;
)
)
saveBlock(bk);
ind.fat[k].num=bk.num;
ind.fat[k].begin=0;
ind.fat[k].end=len;
)
ind.node_num=k;
strcpy(ind.code,selectEntry->ind.code);
strcpy(ind.filename,selectEntry->ind.filename);
ind.num=selectEntry->ind.node_num;
selectEntry->ind=ind;
saveDir();
saveFBT();
printf("文件已保存!\n");
)
voidappendHelpO
{chartmp[MAX_BLOCK_SIZE*2];
charch;
printf(nEndwith$:\n");
inti=0;
while((ch=getchar())!=*$,)
(
if(i==0&&ch=,\n,)
(
continue;
)
tmp[i++]=ch;
)
〃此时已经完成输入
if((i+selectEntry->ind.size)>(MAX_BLOCK_SIZE-1)*MAX.DATANODE
_NUM)
(
printff文件过大,无法存储,创立失败!\nn);
return;
)
else
(
if(selectEntry->ind.size>MAX_BLOCK_SIZE-1)〃已
经占用了两个block
intoffset=selectEntry->ind.size-MAX_BLOCK_SIZE+1;
FILE*bfp=fopen(blockspath,"r+n);
if(bfp==NULL)
(
printf(HDlSKERROR!\nFromappendFile
return;
)
else
(
fseek(bfp,(selectEntry->ind.fat[1].num*(MAX_BLOCK_SIZE-1)+offset),S
EEK.SET);
fwrite(tmp,sizeof(char),i,bfp);
fclose(bfp);
selectEntry->ind.size=selectEntry->ind.size+i;
selectEntry->ind.fat[l].end=selectEntry->ind.fat[1].end+i;
saveDir();
printf("文件保存成功!\n)
)
)
else〃只占用了一个block
if(i<(MAX_BLOCK_SIZE-1-seleuiEnlry->iud.size))〃不会占用新
的block
FILE*bfp=fopen(blockspath,"i'+");
if(bfp二二NULL)
(
printf(MDISKERROR!\nFromappendFile...\nn);
return;
)
else
(
//if(selectEntry->ind.size==O)
//{
//fseek(bfp,O,SEEK_SET);
//selectEntry->ind.fat[O]=0;
//)
//else
//{
//
fseek(bfp,(selectEntry->ind.fat[0].num*(MAX_BLOCK_SIZE-l)+selectEnt
ry->ind.size),SEEK_SET);
//)
//printf("ftell=%l",ftell(bfp));
fseek(bfp,(selectEntry->ind.fat[0].num:{c(MAX_BLOCK_SIZE-l)4-selectEnt
ry->ind.size),SEEK_SET);
fwrite(tmp,sizeof(char),i,bfp);
fclose(bfp);
selectEntry->ind.size=selectEntry->ind.size+i;
selectEntry->ind.fat|O].end=selectEntry->ind.fat[O].end+i;
saveDir();
printf("文件保存成功!\n");
)
)
else〃要占用新的block
(
intbkNum=getFreeBlock(true);
if(bkNum==-l)
(
printf("数据块已用完,内存缺乏!\n”);
return;
)
char*pl二
(char*)malloc((MAX_BLOCK_SIZE-l-selectEntry->ind.size)*sizeof(char));
char*p2=
(char*)malloc((i-(MAX_BLOCK_SIZE-l-selectEntry->ind.size)):5:sizeof(char
));
intpi;
intpnl=0,pn2=0;
for(pi=();pi<i;pi++)
(
if(pi<MAX_BLOCK_S1ZE-1-selectEntry->ind.size)
(
pl[pnl++]=tmp[pi];
)
else
{
p2[pn2++]=tmp[pi];
)
)
plfpnl^W;
p2[pn2]='\0';
〃存储
FILE*bfp=fopen(blockspath,"r+");
if(bfp=NULL)
(
printf(HDlSKERROR!\nFromappendFile
return;
else
fseek(bfp,((MAX_BLOCK_SIZE-l)*selectEntry->ind.fat[()].num+selectEnt
ry->ind.fatl()].end),SEEK_SET);
fwrite(p1,sizeof(char),pn1,bfp);
printf("linenear481\n");
fseek(bfp,((MAX_BLOCK_SIZE-1)*bkNum),SEEK_SET);
fwrite(p2,sizeof(char),pn2,bfp);
fclose(bfp);
FBT[bkNum]=l;
selectEntry->ind.node_num=2;
selectEntry->ind.size=selectEntry->ind.size+i;
selectEntry->ind.fat|O].end=MAX_BL0CK_SIZE-2;
selectEntry->ind.fat[1].num=bkNum;
selectEntry->ind.fat[1].begin=0;
selectEntry->ind.fat[1].end=pn2;
saveFBT();
saveDir();
printfC文件保存成功!\n”);
//核心函数
voidcreate()
(
intbkNum=getFreeBlock(false);
if(bkNum==-l)
{
printf(”数据块已用完,内存缺乏!\n");
return;
)
chartmp;
dirEntry*pt=(dirEntry*)malloc(sizeof(dirEntry));
pt->next=NULL;
while(l)
{
printf(nfilename:");
scanf(,,%s,,,pt->ind.filename);
if(isInDir(pt->ind.filename)!=NULL)
primf("文件名已存在!\ii请重新输入:\n“);
)
else
(
break;
)
)
while(l)
(
printf("Doyouwanttowritethefile?[y/n]:");
scanf("%c",&tmp);
if((tmp==,y,)||(tmp=='Y')||(tmp==,n')||(tmp==,N'))
(
break;
pt->ind.num=curr_inode_num++;
〃文件保护码不是很懂,因此默认为“nrwwwxxx”;
charcode[10]="rrrwwwxxx";
strcpy(pt->ind.code,code);
pt->ind.size=0;
pt->ind.node_num=0;
〃初始化,跟存储要相符合
boolisNoBk=false;
if(tmp==,y'||tmp==,Y')
{
charcontent[MAX_DATANODE_NUM]lMAX_BLOCK_SIZE];
chartmp;
printf("Endwith$\n");
inti=0;
while((tmp=getchar())!=*$')
(
if(i==()&&tmp=='\n,)
{
continue;
)
content[i/MAX_BLOCK_SIZE][i++]=tmp;
}
pt->ind.size=i;
〃此时已经结束输入
if(i>(MAX_BLOCK_SIZE-1)*MAX_DATANODE_NUM)
(
printff文件过大,无法存储,创立失败!\n");
return;
inik;
for(k=0;k<=i/(MAX_BLOCK_SIZE-1);k++)
blockbk;
intbkn;
for(bkn=0;bkn<MAX_BLOCK_SIZE-l;bkn++)
(
bk.content[bkn]='$,;
)
bk.content[MAX_BLOCK_SIZE-1]='\0';
//printf(Hbk.content:%s\n",bk.content);
char*tmp;
inttp=O;
intlen=0;
if(k==O)
(
if(i<MAX_BLOCK_SIZE-1)
(
len=i;
)
)
if(k==l)
len=i%(MAX_BLOCK_SIZE-1)+1;
for(tp=0;tp<len;tp++)
bk.content[tp]=content[kj|tp];
)
bk.isRevised=true;
if(k==O)
(
bk.num=bkNum;
)
else
(
bk.num=getFreeBlock(true);
if(bk.num==-l)
(
printf("数据块已用完,内存缺乏!\n");
return;
)
)
saveBlock(bk);
pt->ind.fat[k].num=bk.num;
pt->ind.fat[k].begin=0;
pl->ind.fat[k].end=len;
}
pt->ind.node_num=k;
)
if(cunEntry==NULL)
(
DIR=pt;
)
else
(
currEntry->next=pt;
)
currEntry=pt;
saveDir();
saveFBT();
printf("Succeedcreatefile[%s]!",pt->ind.filename);
)
voiddel()
(
chartmp|30];
printf(”请输入要删除的文件名:”);
scanf("%sn,tmp);
if(isInDir(liiip)==NULL)
printf(”不存在这个文件。\n)
return;
)
else
(
dirEntry*dle=delHelp(tmp);
if(dle!=NULL)
(
inti;
for(i=();i<dle->ind.node_num;i++)
(
FBT[dle->ind.fat[i].num]=O;
)
}
)
saveDir();
saveFBT();
)
voidopen()
charfile[5O];
printf(”请输入文件名:*1);
scanf("%sn,file);
selectEntry=isInDir(file);
if(selectEntry==NULL)
(
printf("没有这个文件!\n");
)
else
(
printf("文件[%s]已翻开,输入close关闭.\n”,file);
intc=0;
while(l)
(
if(c==l)
(
break;
)
switch(getCode())
(
case5:
read();
break;
case6:
write();
break;
case7:
close();
c=l;
break;
default:
printf("无效的指令\n”);
)
)
)
)
voidread()
(
FILE*bfp=fopen(blockspath,"r");
if(bfp==NULL)
{
printf(”不存在磁盘文件!\n)
while(l);
else〃翻开磁盘文件
inti;
chartmp='
printf("文件[%5]中的内容如下:\n",selectEntry・>ind.filename);
if(selectEntry->ind.size==O)
(
primf(”内容为空。\nH);
}
else
(
for(i=0;i<selectEntry->ind.node_num;i++)
(
fseek(bfp,(selectEntry->ind.fat[i].num*(MAX_BLOCK_SIZE-l)),SEEK_S
ET);〃这个offset很重要
imj;
fbr(j=selectEntry->ind.fat[i].begin;j<selectEntry->ind.fat[i].end;j++)
(
tmp二fgetc(bfp);
printf(M%c",tmp);
prinlf(',\n'');
)
fclose(bfp);
voidclose()
(
selectEntry==NULL;
printf("文件已关闭!\n");
)
voidwrite()
(
charsel[10];
charcm_cover[10]="cover";
charcm_append[10]="append";
while(l)
{
printf("请输入指令:\n[append]:在原文件根底上新增数据.\n[cover]:覆
盖原数据\n[cancle]:取消\n");
printf("Command:");
scanf(n%s'\sel);
if(!slruinpi(sel.uiii_uanule))
printf("取消!\n");
break;
)
if(!strcmpi(sel.cm_cover))
(
coverHelpO;
break;
)
if(!strcmpi(seLcm_append))
(
if(selectEntry->ind.size==O)
(
coverHelpO;
)
else
{
appendHelpO;
)
break;
printf("指令无效\n");
voidinitFBT()
FILE*fp;
fp=fopen(fbtpathJT');
if(fp==NULL)
(
printf("CannotopenFBTfilesAn");
while(l);
)
else
(
inti=0;
while(!feof(fp))
(
fscanf(fp,n%dH,&FBT[i++]);
if(i==MAX_BLOCK_SIZE-1)
break;
)
intgetCode()
(
charcmd[10];
printf("Command:");
scanf("%s",cmd);
if(!strcmpi(cmd,cm_exit))
(
return-1;
)
if(!strcmpi(cmd,cm_help))
(
return0;
)
if(!strcmpi(cmd,cm_dir))
(
return1;
if(!slrunipi(uind,um_ureale))
return2;
if(!strcmpi(cmd,cm_delete))
(
return3;
)
if(!strcmpi(cmd,cm_open))
(
return4;
)
if(!strcmpi(cmd,cm_read))
(
return5;
)
if(!strcmpi(cmd,cm_write))
|
return6;
)
if(!strcmpi(cmd,cm_close))
return7;
return8;
)
intgetAction()
(
switch(getCode())
{
case-1:
(
return-1;
)
case0:
help();
break;
case1:
dir();
break;
case2:
create();
break;
case3:
del();
break;
case4:
open();
break;
default:
printf("无效的指令\n");
)
return0;
)
FILE*createDir(char*dirpath)
(
FILE*fp=fopen(dirpath,nwH);
if(fp==NULL)
{
printf("CannotcreateDirectory!\nn);
while(l);
)
else
fuluse(fp);
FILE*f=fopen(dirpath,HrH);
returnf;
)
)
char*getDirpath(char*username)
(
char*res;
res=(char*)malloc(50*sizeof(char));
chart[10]="userdata/";
chartail[5]=".dir'1;
strcpy(res,t);
strcat(res,username);
strcat(res,tail);
returnres;
)
voidinitDir(char*dirpath)
{
FILE*p;
p=fopen(dirpath,nrH);
if(p==NULL)
p=urealeDir(dirpalh);
dirEntry*pp=(dirEntry*)malloc(sizeof(dirEntry));
pp->next=NULL;
DIR=NULL;
intnm=0;
while(!feof(p))
(
if(nm!=0)
(
dirEntry*pt=(dirEntry*)malloc(sizeof(dirEntry));
pt->next=NULL;
pp->next=pt;
PP-Pt;
)
intr=fscanf(p,n%sn,pp->ind.filename);
if(r==EOF)
(
break;
}
fscanf(p,"%dn,&(pp->ind.num));
if(max_node<pp->ind.num)
niax_node=pp->ind.iiuin;
}
fscanf(p,"%sn,pp->ind.code);
fscanf(p,,'%d,',&pp->ind.size);
if(pp->ind.size!=O)
(
fscanf(p,,,%d',,&pp->ind.node_num);
intj;
inttemp=0;
for(j=0;j<pp->ind.node_num;j++)
{
fscanf(p,"%d',,&pp->ind.fat[j].num);
fscanf(p,H%d",&pp->ind.fat[j].begin);
fscanf(p,n%dn,&pp->ind.fat[j].end);
//showInode(DIR[curr_inode_num]);
curr_inode_num++;
if(curr_inode_num=MAXJNODE_NUM)
(
break;
if(iiin==O)
DIR=pp;
nm=1;
currEntry=pp;
fclose(p);
voidinit()//初始化Cache,dir
(
//cache=(block*)malloc(MAX_CACHE_NUM*sizeof(block));
initDir(getDirpath(currUser.account));
printf(nFinishedinitDir..An");
initFBT();
printf(nFinishedinnitFBT...\n");
)
voidstart()
printf(”欢送使用虚拟文件管理系统V1.0\nu);
FILE*ufp=fopen(userspath,Mr");//检查是否第一次使用本系
统,查看是否存在users文件
if(ufp==NULL)
(
printf(“亲~\(八0八)/~:\n初次见面,请多照顾哦!\n");
createDataDir();
FILE*fp=fopenCuserspath/'w");
createBlocksDisk();〃第一次使用,需要
开辟[磁盘]空间
if(fp二二NULL)
(
printf(n\n严重错误!请联系程序猿哥哥QQ878631510~1n”);
while(l);
return;
}
else
fclose(fp);
else
fclose(ufp);
while(LgRgO);
printf("已进入FMS文件管理虚拟系统\n");
dirpath=getDirpath(currUser.account);
//printf("initdirpath...\nH);
init();
printf("系统初始化已完成,输入help查看命令帮助,输入exit/quit退出系
统\n”);
while(getAction()!=-1);
voidgetUser()
(
while(l)
prinlf("accounl(lenglh<10):");
scanf(n%s",currUser.account);
if(strlen(currUser.account)<=10)
(
break;
)
else
(
printf("账户名最长为10位An");
)
)
while(l)
(
printf("password(length<10):");
scanf("%s",currUser.password);
if(strlen(currUser.password)<=10)
(
break;
)
else
printfC账户名最长为10位.\n");
intlogin()
getUser();
FILE*ffp=fopen(userspath,HrH);
if(ffp==NULL)
(
printf("FILEERROR!");
exit(O);
)
else
(
usertemp;
while(!feof(ffp))
(
fscanf(ffp,"%s”,temp.account);
fscanf(ffp,"%sn,temp.password);
if((!strcmpi(temp.account,
currUser.account))&&(!strcmpi(temp.password,currUser.password)))
(
fclose(ffp);
return0;
fclose(ffp);
return-1;
)
)
intregist()
(
getUser();
FILE*fp=fopen(userspath,nan);
if(fp==NULL)
(
printf(HFILEERROR!”);
return-1;
)
else
{
fprintf(fp,*'%s",currUser.account);
fprintf(fp,”%s\nH,currUser.password);
fclose(fp);
return0;
intLgRg()
charcom[10];
chartype=IgOrRgO;
if(type==,r)
(
if(login())
(
printf("登录失败!\nM);
return-1;
)
else
(
printf("登录成功!\nM);
return0;
else
if(regist())
(
printf("注册失败!\nn);
return-1;
)
else
(
printf("注册成功!\n");
return0;
1
)
)
voiddir()
(
printf("文件名\t物理地址\t保护码\t\t文件长度\n”);
inti=0;
dirEntry*pt=DIR;
while(pt!=NULL)
printf("%s\t%d\t\t%s\t\t%d\nM,pt->ind.filename,i++,pt->ind.code,pt->ind.siz
e);
pt=pt->next;
)
)
voidsaveDir()
(
//printf("dirpath=%s\nn,dirpath);
FILE*fp=fopen(getDirpath(currUser.account),"w");
if(fp==NULL)
(
printf("updateDirDiskERROR!\nH);
while(l);
)
else
{
intj;
dirEntry*p=DIR;
while(p!=NULL)
fprintf(fp,"%sn,p->ind.filename);
fprintf(fp,"%d",p->ind.num);
fprintf(fp,n%s",p->ind.code);
fprintf(fp,"%dM,p->ind.size);
if(p->ind.size!=O)
(
fprintf(fp,H%d,',p->ind.node_num);
for(j=0;j<p->ind.node_num;j++)
(
fprintf(fp,H%d",p->ind.fat[j].num);
fprintf(fp,"%d",p->ind.fat[j].begin);
fprintf(fp,"%d",p->ind.fat[j].end);
)
)
p=p->next;
}
fclose(fp);
)
)
voidsaveBlock(blockbk)
(
FILE*fp=fopen(blockspath,"r+");
if(fp==NULL)
printf("SaveBlockERROR!\nH);
else
(
longoffset=bk.num*(MAX_BLOCK_SIZE-1);
fseek(fp,offset,SEEK_SET);
fwrite(bk.content,sizeof(char),strlen(bk.content),fp);
fclose(fp);
FBT[bk.num]=1;
)
)
voidsaveFBT()
(
FILE*fp=fopen(fbtpath,"w");
if(fp==NULL)
{
printf("SaveFBTERROR!\nn);
while(l);
else
inti;
for(i=0;i<MAX_BLOCKS_NUM;i++)
(
fprintf(fp,H%dn,FBT[i]);
)
fclose(fp);
〃数据块选择算法
intgetFreeBlock(boolisAdd)〃因为文件最多占用两个数据块,因此在
未用数据块的时候要保证至少有两个数据块
{〃假设已经用了一个数据块,那么只
要保证再有一个数据块就够了
intpos=-1;
intnum=0;
intk;
for(k=();k<MAX_BLOCKS_NUM;k++)
(
if(FBT|k|==0)
if(isAdd==true)
returnk;
if(num==O)
(
pos=k;
num++;
)
else
(
returnpos;
return-1;
)
Main.c文件
#include"head.hn
voidmain()
slarl();〃启动函数
六、程序运行时的初值和运行结果
初始界面:
❽C©admin^)dzp-virtual-machine:~/programs/FMSV1.0
admin@dzp-virtual-machine:~/programs/FMSVl.0$./FMSV1.0
欢迎使用虚拟文件管理系统VI.0
养〜
初次见面,请多关照哦!
NodataDtr!
Nowcreateit...
SucceedcreatingdataDtr!
[login]or[register]:口
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度木材购销合同模板(含木材纹理应用)
- 二零二五年度文化产业借款协议书
- 加油站合伙经营协议书(2025年执行)
- 二零二五年度家庭赡养老人费用分摊及养老护理协议
- 2025年度智能健身中心全新会员卡储值服务协议
- 二零二五年度网络短视频影视作品演员签约合同
- 二零二五年度老年用品销售提成及养老服务协议
- 二零二五年度公司单位员工保密协议与劳动合同合并文本
- 二零二五年度酒店客房租赁与旅游导游服务合同
- 二零二五年度服装零售店铺转让协议书模板
- 股骨颈骨折ppt精品
- 2023年江苏农牧科技职业学院单招职业适应性测试题库及答案解析
- 毛泽东诗词鉴赏分析
- 小学数学-纳税教学设计学情分析教材分析课后反思
- 量具检具清单
- YY/T 1833.2-2022人工智能医疗器械质量要求和评价第2部分:数据集通用要求
- 光催化原理(经典)课件
- 苏科版初中物理实验目录
- 如何上好一堂课(课件)
- 动车组列车乘务人员实务教材课件
- 西方文艺理论史精读文献课件
评论
0/150
提交评论