📄 main.cpp
字号:
BWriteArr(dir,iNode->iaddr[10]);
if(left>0){ //二级索引
short k=512;
short j=512;
short dirChild[512];
iNode->iaddr[11]=AssAnEmpty();
while(left&&k){ //二级索引1次寻址
dir[512-k]=AssAnEmpty();
while(left&&j){ //二级索引二次寻址
dirChild[512-j]=AssAnEmpty();
left--;
j--;
}
if(j!=0)
dir[512-j+1]=-1; //标志二级索引二次寻址结束
BWriteArr(dirChild,dir[512-k]);
BWriteArr(dir,iNode->iaddr[11]);//写二级索引一次寻址中盘快记录的一次寻的盘快号
k--;
}
if(k!=0)
dir[512-k+1]=-1;//标志文件结束
}
}
}
//================================================================
//函数描述:清空iNode信息,并分配磁盘空间
//入口参数:无
//返回值: 无 AssAnEmpty(),BWrite(dirChild,dir[512-i])未实现
//===============================================================
void CleanINode(INode *iNode){
iNode->fileSpec=PIP;
iNode->linkCount=-1;
iNode->fileLength=-1;
//根据文件长度非配文件磁盘节点
//直接寻址
for(short i=0;i<13;i++)
iNode->iaddr[i]=-1;
}
//================================================================
//函数描述:创建一个iNode,并分配磁盘空间
//入口参数:无
//返回值: 无
//===============================================================
void InsertDir(DirNode *currDir,char fileName[14],short blockNum){
strcpy(currDir->childItem[currDir->DirCount].filename,fileName);
currDir->childItem[currDir->DirCount].i_BNum=blockNum;
currDir->DirCount++;
return;
}
//================================================================
//函数描述:存在文件,并分配iNOde节点和磁盘空间
//入口参数:无
//返回值: 无
//===============================================================
void Create(DirNode *currDir,char fileName[14],INode *iNode,short length,FileSpec fileSpec){
int blockNum;
if(length>freeTotalB){
cout<<"当前文件超出长度"<<endl;
return;
}
CreateINode(iNode,fileSpec,0,length);
blockNum=AssAnEmpty();//分配一个空余磁盘存储iNOde
InsertDir(currDir,fileName,blockNum);
BWrite(iNode,blockNum);
CleanINode(iNode);
BWrite(currDir,currDirNum);//此处
}
//================================================================
//函数描述:创建一个文件,
//入口参数:无
//返回值: 无
//===============================================================
void Mf(DirNode *currDir,char fileName[14],INode *iNode,short length){
int blockNum=IsFileExist(currDir,fileName);
if(blockNum!=-1){//有重名名,进一步判断
if(IsFile(iNode,blockNum))
cout<<"当前文件已经存在,请重新输入文件名"<<endl;
} else{//存在文件,为索引文件,或者无重名现象,创建文件,并分配iNOde节点和磁盘空间
// BRead(iNode,1059);//此处出错
Create(currDir,fileName,iNode,length,NORMAL);
}
}
//================================================================
//函数描述:在当前目录创建一个子目录
//入口参数:无
//返回值: 无
//===============================================================
void Md(DirNode *currDir,char fileName[14],INode *iNode,short length){
int blockNum=IsFileExist(currDir,fileName);
if(blockNum!=-1){//有重名名,进一步判断
if(IsDir(iNode,blockNum))
cout<<"当前目录已经存在,请重新输入目录名"<<endl;
} else{//存在文件但为普通文件,或者无重名现象。创建文件,并分配iNOde节点和磁盘空间
Create(currDir,fileName,iNode,length,DIR);
CleanINode(iNode);
}
}//================================================================
//函数描述:打开一个文件,
//入口参数:无
//返回值: 无
//===============================================================
void ShowBlockInfo(INode *iNode){
short dir[512];
short i;
i=10;
short left=iNode->fileLength;
while(left&&i){
cout<<(iNode->fileLength-left)<<":"<<iNode->iaddr[10-i]<<" ";
left--;
i--;
}
if(left>0){
i=512;
short dir1[512];
BReadArr(dir1,iNode->iaddr[10]);
while(left&&i){
cout<<(iNode->fileLength-left)<<":"<<dir1[512-i]<<" ";
i--;
left--;
}
}
if(left>0){ //二级索引
short k=512;
short j=512;
short dirChild[512];
BReadArr(dir,iNode->iaddr[11]);
while(left&&k){ //二级索引1次寻址
BReadArr(dirChild,dir[512-k]);
while(left&&j){ //二级索引二次寻址
cout<<(iNode->fileLength-left)<<":"<<dirChild[512-j]<<" ";
left--;
j--;
}
k--;
}
}
}
//================================================================
//函数描述:打开一个文件,
//入口参数:无
//返回值: 无
//===============================================================
void ShowFileInfo(INode *iNode,char fileName[14]){
cout<<"文件名 "<<fileName;
cout<<" 文件类型 ";
switch(iNode->fileSpec){
case NORMAL:
cout<<"< 文件 > ";
break;
case DIR:
cout<<"< 目录 > ";break;
case BLOCK:
cout<<"< INode节点 > ";break;
case PIP:
cout<<"管道 ";break;
}
cout<<" "<<iNode->fileLength<<"KB"<<endl;
}
//================================================================
//函数描述:打开一个文件,
//入口参数:无
//返回值: 无
//===============================================================
void Open(DirNode *currDir,char fileName[14],INode *iNode){
int blockNum=IsFileExist(currDir,fileName);
if(blockNum==-1){//不存在该文件,退出
cout<<"该文件按不存在"<<endl;
return;
}
else{
if(IsFile(iNode,blockNum)){
ShowFileInfo(iNode,fileName);
ShowBlockInfo(iNode);
}
}
}
//================================================================
//函数描述:回收一块空余磁盘片
//入口参数:无
//返回值: 无
//===============================================================
void CallBackOne(short diskNum){
freeTotalB++;
if(SS[0]<=49){
SS[0]++;
SS[SS[0]]=diskNum;
}else{//SS[0]==50
BWrite(SS,freeBlockNum); //将空白的一组回写到上一组记录空闲盘快号的磁盘
freeBlockNum=SS[1]; //将当前空白的一组第一个盘快作为下一个盘组的记录盘
//修改超级栈
SS[1]=diskNum;
SS[0]=1;
}
}
//================================================================
//函数描述:回收文件占用的磁盘
//入口参数:无
//返回值: 无
//===============================================================
void CallBackDisk(INode *iNode){
short i;
i=10;
short left=iNode->fileLength;
while(left&&i){//直接索引回收
CallBackOne(iNode->iaddr[10-i]);
left--;
i--;
}
if(left>0){ //一级索引回收
i=512;
short dir1[512];
BReadArr(dir1,iNode->iaddr[10]);
while(left&&i){
CallBackOne(dir1[512-i]);
i--;
left--;
}
CallBackOne(iNode->iaddr[10]);
}
if(left>0){ //二级索引
short k=512;
short j=512;
short dir[512];
short dirChild[512];
BReadArr(dir,iNode->iaddr[11]);//二级索引1次寻址
while(left&&k){ //二级索引1次寻址
BReadArr(dirChild,dir[512-k]);
while(left&&j){ //二级索引二次回收
CallBackOne(dirChild[512-j]);
left--;
j--;
}
CallBackOne(dir[512-k]);//二级索引一次寻址
k--;
}
CallBackOne(iNode->iaddr[11]);
}
}
//================================================================
//函数描述:回收文件的iNOde节点
//入口参数:无
//返回值: 无
//===============================================================
void CallBackINode(short diskNum){
CallBackOne(diskNum);
}
//================================================================
//函数描述:删除索引中一项
//入口参数:无
//返回值: -1,不存在,文件号
//===============================================================
void DelDirItem(DirNode *currDir,char fileName[14]){
for(int i=0;i<64;i++){
if(strcmp(fileName,currDir->childItem[i].filename)==0){
// currDir->DirCount--;
strcpy(currDir->childItem[i].filename,NullName);
currDir->childItem[i].i_BNum=-1;
return;
}
}
cout<<"删除失败"<<endl;
}
//================================================================
//函数描述:删除一个文件
//入口参数:无
//返回值: 无
//===============================================================
void Del(DirNode *currDir,char fileName[14],INode *iNode){
short blockNum=IsFileExist(currDir,fileName);
if(blockNum==-1){//不存在该文件,退出
cout<<"文件不存在,删除失败"<<endl;
}else{
if(IsFile(iNode,blockNum)){
CallBackDisk(iNode);
DelDirItem(currDir,fileName);
CleanINode(iNode);
}else{
cout<<"文件不存在,删除失败"<<endl;
}
}
}
//================================================================
//函数描述:删除一个目录
//入口参数:无
//返回值: 无
//===============================================================
void Rd(DirNode *currDir,char fileName[14],INode *iNode){
short blockNum=IsFileExist(currDir,fileName);
if(blockNum==-1){//不存在该文件,退出
cout<<"目录不存在,删除失败"<<endl;
}else{
if(IsDir(iNode,blockNum)){
CallBackDisk(iNode);
DelDirItem(currDir,fileName);
CleanINode(iNode);
}else{
cout<<"目录不存在,删除失败"<<endl;
}
}
}
//================================================================
//函数描述:显示目录项的内容
//入口参数:无
//返回值: 无
//===============================================================
void Dir(DirNode *currDir,INode *iNode){
for(int i=0;i<currDir->DirCount;i++){
if(currDir->childItem[i].i_BNum!=-1){
BRead(iNode,currDir->childItem[i].i_BNum);
ShowFileInfo(iNode,currDir->childItem[i].filename);
}
CleanINode(iNode);
}
}
//================================================================
//函数描述:销毁资源
//入口参数:无
//返回值: 无
//===============================================================
void exit(DirNode *currDir,INode *iNode){
delete iNode;
delete currDir;
}
//================================================================
//函数描述:打印版权信息
//入口参数:无
//返回值: 无
//===============================================================
void AuthorMessage(){
cout<<"=============================================================================="<<endl;
cout<<" 操作系统课程设计"<<endl;
cout<<"=============================================================================="<<endl;
printf("单位: 济南大学信息学院计本0601班\n");
printf("作者: 范海青\n");
printf("学号: 20061204013\n");
printf("时间: 2009.4 \n");
printf(" 版权所有 翻版必究\n");
cout<<"=============================================================================="<<endl;
}
//================================================================
//函数描述:打印版权信息
//入口参数:无
//返回值: 无
//===============================================================
void help() //打印命令及解释
{
cout<<"==============================================================================\n"<<endl;
printf(" 命令使用指南\n");
printf(" 1: mf 新建文件\n");
printf(" 2: md 建立子目录\n");
printf(" 3: open 打开文件\n");
printf(" 4: del 删除文件\n");
printf(" 5: rd 删除目录\n");
printf(" 6: dir 显示目录\n");
printf(" 7: exit 退出系统\n");
printf(" 8: cls 清屏\n");
cout<<"==============================================================================\n"<<endl;
cout<<"\n请输入命令,回车确认"<<endl;
}
void main(){
bool run=true;
int length=1024;
char fileName[14];
char dirName[14];
int command;
DirNode *rootNode; //根节点
currDir=new DirNode;
currDir->DirCount=0;
rootNode=currDir;
iNode =new INode;
AuthorMessage();
Format(); //初始化
Linkdisk(); //成组连接
Init();
Init(currDir,DIR,"root\\a:\\",iNode,0);
while(run){
help();
while(true){
scanf("%d",&command);
fflush(stdin);
if(command>0&&command<9)
break;
cout<<"\n命令错误,请重新输入"<<endl;
command=-1;
}
switch(command)
{
case 1:
cout<<"\n请输入文件名"<<endl; //新建问件
cin>>fileName;
fflush(stdin);
cout<<"\n请输入文件长度,单位KB"<<endl;
cin>>length;
fflush(stdin);
if(length<0||length>freeTotalB){
cout<<"文件长度不合法\n"<<endl;
break;
}
Mf(currDir,fileName,iNode,length);
break;
case 2:
cout<<"\n请输入目录名"<<endl;
cin>>dirName;
Md(currDir,dirName,iNode,1);
break;
case 3:
cout<<"\n请输入打开文件名"<<endl; //打开文件
cin>>fileName;
Open(currDir,fileName,iNode);
break;
case 4:
cout<<"\n请输入删除文件名"<<endl; //删除文件
cin>>fileName;
Del(currDir,fileName,iNode);
break;
case 5: //建立子目录
cout<<"\n请输入目录名"<<endl;
cin>>dirName;
Rd(currDir,dirName,iNode);
break;
case 6:
Dir(currDir,iNode); //显示当前目录下的信息
break;
case 7:
exit(currDir,iNode); //退出系统
run=false;
break;
case 8:
system("cls"); //清屏
break;
default:
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -