实验三: 二级目录文件系统
课程设计目的:
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识。
实验原理:
系统中有一个主文件目录(MFD),每个已注册的用户在该目录中占据一个表目,其内容包括用户名、口令、用户目录指针、链指针等,系统启动时,首先建立主文件目录。
每个已注册用户拥有一个自己的用户文件目录(UFD),该用户的每一个文件均在UFD中占据一个表目,其内容包括文件名、保护码、文件长度、链指针等。每创建一个文件要在UFD中加入一个表项,每删除一个文件也要UFD中删除其对应表目。其它对文件的操作也要对UFD进行相应修改。对即将要进行访问的文件,系统建立一个活动文件目录AFD,用于存放已打开文件的有关信息。设系统最多可同时打开5个文件,每个已打开的文件在AFD中占据一个表目,内容包括:打开文件名、打开文件保护码、读指针、写指针4项。文件关闭时,撤消其在AFD中的对应表项。
系统首先进行初始化,建立MFD,然后注册一批用户,初始化AFD,随后处于待命状态. 创建文件: 输入文件名、保护码、长度、生成一个UFD块并挂在该用户的UFD链链尾。 删除文件:输入文件名,在该用户的UFD链中删除该文件对应的UFD块。若该文件是已打开的文件,还要删除其在AFD中的对应表目。
数据结构:
typedef struct MFD//主文件目录
{
char userName[14];//用户名 char passNumber[14];//密码 int ufdLink;//块号
}mfd;
typedef struct UFD//用户文件目录 {
26
char fileExist[9]; //文件是否存在标志位 char fileName[14]; //文件名14B;
char fileMode; //文件权限0-readonly;1-writeonly;2-read/write int fileLength; ///文件长度
int fileFirstBlock;//该文件的第1个文件块对应的物理块号
}ufd;
源码分析:
int Write(string s,string t,int n) { cmRead.readUof(userUof); list
for(it=userUof.begin();it!=userUof.end();++it) { if(it->fileName==s) { //找到了该文件 //计算文件长度,块号 int len,addr;
len=cmRead.readUfdFileLength(it->filePoint); addr=cmRead.readUfdFileAddr(it->filePoint); //更新ufd
list
for(im=userUfd.begin();im!=userUfd.end();++im) { if(im->fileName==s) {
im->fileLength+=n;
27
break;
}
}
cmRead.reWriteUfdTotal(userUfd,usermfd.ufdLink); //写文件
cmRead.findLastBlockOfFile(addr,len); cmRead.writeFile(addr,len,t.substr(0,n));
//更新uof it->writeP+=n;
cmRead.reWriteUof(userUof);
cout<<\写入成功\\n\ return 13;
}
}
list
for(iu=userUfd.begin();iu!=userUfd.end();++iu) { count++;
if(iu->fileName==s) {
//找到该文件,先打开,更新uof
uof ut; //文件属性在disk.txt中的位置
int position=usermfd.ufdLink*514+(count-1)*32+23; char *p=\为打开模式
ut.set(iu->fileName,position,p,0,n,2+'0');
28
userUof.push_back(ut);//在uof表的最后添加一项
cmRead.reWriteUof(userUof);//uof表重新写入disk
int m=cmRead.readUfdFileAddr(ut.filePoint); int q=cmRead.readUfdFileLength(ut.filePoint); //写文件 int lenth,block; block=iu->fileFirstBlock; lenth=iu->fileLength;
cmRead.findLastBlockOfFile(block,lenth); cmRead.writeFile(block,lenth,t.substr(0,n));
//更新Ufd
iu->fileLength+=n; }
int Open(string s,int n) {
//如果模式不满足要求0-2
if(n<0||n>2){cout<<\无该模式,模式0-readonly;1-writeonly;2-read/write,请核对输入 }
cout<<\无该文件,请检查文件名!\\n\return 13;
cmRead.reWriteUfdLength((count-1)*32+24,usermfd.ufdLink,iu->fileLength);
cout<<\写入成功\\n\ }
return 13;
\
//否则继续
cmRead.readUof(userUof);
29
list
}
}
list
for(iu=userUfd.begin();iu!=userUfd.end();++iu) { count++;
if(iu->fileName==s) { uof temp; char*p=\
temp.set(iu->fileName,usermfd.ufdLink*514+(count-1)*32+23,p,0,0,n+'0'); userUof.push_back(temp); cmRead.reWriteUof(userUof); cout<<\打开成功\\n\ return 14; }
}
cout<<\无该文件,请检查文件名!\\n\ return 14;
}
int Read(string s,int n) {
30