📄 filesystem.cpp
字号:
outputUrl();
return 1;
}
int filesystem::rd()
{
struct fcb *p,*f;
if(locateDir(0)==0)
{
printf("系统找不到指定文件\n");
goto over;
}
f=present;/////////////////////////////////////////////////
p=present->child;
while(p!=NULL)
{
if(p->type==F)
continue;
if(strcmp(p->filename,dirs.dir[dirs.i-1])==0)
break;
f=p;
p=p->rightbrother;
}
if(p==NULL)
printf("系统找不到指定文件\n");
else if(p->child!=NULL)
printf("目录不为空\n");
else if(p==predir)
printf("另一个程序正在使用此文件,进程无法访问\n");
else if(f==present)
f->child=p->rightbrother;
else
f->rightbrother=p->rightbrother;
over:
outputUrl();
return 1;
}
void filesystem::tree(struct fcb *predir,int n)
{
struct fcb *p;
p=predir->child;
if(p!=NULL)
while(p!=NULL)
{
if(p->type==DIR)
{
for(int i=0;i<n;i++)
printf("\| ");
printf("\|____%s\n",p->filename);
tree(p,n+1);
}
p=p->rightbrother;
}
else if(n==0)
printf("没有子文件夹\n");
return;
}
void filesystem::getCmd()
{
char cmdtype[10];
int i=0,times=0;
gets(cmd);
cp=0;
times++;
while(cmd[cp]==' ')
{
cp++;
}
// cmdtype[i]=cmd[cp];
while(cmd[cp]!=' '&&cmd[cp]!='\0')
{
cmdtype[i]=cmd[cp];
i++;
cp++;
}
if(cmd[cp]==' ')
cp++;
dc=cp;
cmdtype[i]='\0';
analysisCmd();
if(strcmp(cmdtype,"md")==0)
md();
else if(strcmp(cmdtype,"dir")==0)
dir();
else if(strcmp(cmdtype,"rd")==0)
rd();
else if(strcmp(cmdtype,"tree")==0)
outputTree();
else if(strcmp(cmdtype,"mk")==0)
mk();
else if(strcmp(cmdtype,"del")==0)
del();
else if(strcmp(cmdtype,"cd")==0)
cd();
//---------------------------------------------
else if(strcmp(cmdtype,"c:")==0)
{
printf("\nC:\\>");
strcpy(url,"C:\\");
front=c;
present=c;
predir=c;
pd.db[dp].state=0;
pd.p=0;
dp=0;
pd.db[dp].state=1;
getCmd();
}
else if(strcmp(cmdtype,"d:")==0)
{
printf("\nD:\\>");
strcpy(url,"D:\\");
front=d;
present=d;
predir=d;
pd.db[dp].state=0;
pd.p=1;
dp=1;
pd.db[dp].state=1;
getCmd();
}
else if(strcmp(cmdtype,"e:")==0)
{
printf("\nE:\\>");
strcpy(url,"E:\\");
front=e;
present=e;
predir=e;
pd.db[dp].state=0;
pd.p=2;
dp=2;
pd.db[dp].state=1;
getCmd();
}
else if(strcmp(cmdtype,"f:")==0)
{
printf("\nF:\\>");
strcpy(url,"F:\\");
front=f;
present=f;
predir=f;
pd.db[dp].state=0;
pd.p=3;
dp=3;
pd.db[dp].state=1;
getCmd();
}
//---------------------------------------------
else if(strcmp(cmdtype,"fat")==0)
outFat();
else if(strcmp(cmdtype,"sfree")==0)
weishitu();
else if(strcmp(cmdtype,"help")==0)
help();
else if(strcmp(cmdtype,"exit")==0)
exit_();
else if(cmdtype[0]=='\0')
outputUrl();
else
{
cout<<"'"<<cmdtype<<"'"<<"不是内部或外部命令,也不是可运行程序或批处理文件"<<endl;
// if(times==1)
outputUrl();
}
}
void filesystem::help()
{
cout<<"md 创建子目录。"<<endl;
cout<<"cd 定位目录。"<<endl;
cout<<"rd 删除空子目录。"<<endl;
cout<<"dir 列出当前目录对象。"<<endl;
cout<<"tree 显示树形目录。"<<endl;
cout<<"mk 创建文件。"<<endl;
cout<<"del 删除文件。"<<endl;
cout<<"fat 查看FAT表。"<<endl;
cout<<"sfree 查看位视图。"<<endl;
cout<<"help 提供命令帮助信息。"<<endl;
cout<<"exit 退出CMD.EXE程序(命令解释程序)。"<<endl;
outputUrl();
}
void filesystem::exit_()
{
exit(0);
// system("exit");
}
int filesystem::analysisCmd()
{
int j;
//先清空dir.dir[]中原有内容
for(j=0;j<dirs.i;j++)
strcpy(dirs.dir[j],"");
dirs.i=0;
// if(strcmp(cmd,"cd \\")==0)
if(cmd[cp]=='\\')
{
// strcpy(dirs.dir[0],"\\");
dirs.dir[0][0]='\\';
dirs.dir[0][1]='\0';
dirs.i++;
cp++;
// return 1;
}
while(cmd[cp]!='\0')
{
j=0;
while(cmd[cp]!='\\'&&cmd[cp]!='\0')
{
dirs.dir[dirs.i][j]=cmd[cp];
j++;
cp++;
}
dirs.dir[dirs.i][j]='\0';
if(cmd[cp]!='\0')
cp++;
dirs.i++;
}
return 1;
}
int filesystem::locateDir(int type)
{
int i,j;
struct fcb *p,*t;
char turl[100];
strcpy(turl,url);//保存URL
i=0;
present=predir;
if(strcmp(dirs.dir[i],".")==0)
{
i=1;
present=present;
//url不变
}
else if(strcmp(dirs.dir[i],"..")==0)
{
i=1;
present=present->father;
j=0;
while(url[j]!='\0'){j++;}//找到末尾
while(url[j]!='\\'){j--;}//退一级
if(url[j-1]==':')//已退到根目录
{
url[2]='\\';
url[3]='\0';
}
else
url[j]='\0';
}
else if(strcmp(dirs.dir[i],"\\")==0)
{
i=1;
switch(pd.p)
{
case 0: present=c; strcpy(url,"C:\\"); break;
case 1: present=d; strcpy(url,"D:\\"); break;
case 2: present=e; strcpy(url,"E:\\"); break;
case 3: present=f; strcpy(url,"F:\\"); break;
}
}
else
{
i=0;
}
p=NULL;
t=present;
for(i;i<dirs.i-1;i++)
{
p=t->child;
while(p!=NULL)
{
if(p->type==F)
continue;
if(strcmp(p->filename,dirs.dir[i])==0)
{
t=p;
if(url[3]!='\0')
strcat(url,"\\");
strcat(url,p->filename);
break;
}
p=p->rightbrother;
}
if(p==NULL)//找不到路径,返回原来的url
{
strcpy(url,turl);
return 0;
}
}
if(type!=CD)
strcpy(url,turl);//返回原来的URL
if(p!=NULL)
present=p;
return 1;
}
void filesystem::outputTime(fcb *p)
{
printf("%d",(p->createtime).wYear);
printf("-");
printf("%d",(p->createtime).wMonth);
printf("-");
printf("%d",(p->createtime).wDay);
printf(" ");
printf("%2d",(p->createtime).wHour);
printf(":");
printf("%2d",(p->createtime).wMinute);
printf(" ");
}
void filesystem::run()
{
outputUrl();
}
void filesystem::outputUrl()
{
printf("\n%s",url);
printf(">");
getCmd();
}
void filesystem::outputTree()
{
int n=0,i=dirs.i-1;
struct fcb *p;
char tempurl[50];
strcpy(tempurl,url);
if(dirs.i==0)
{
p=predir;
goto next;
}
if(locateDir(0)==0)
{
if(url[3]!='\0')
strcat(tempurl,"\\");
strcat(tempurl,(cmd+dc));
printf("无效的路径 - %s\n",tempurl);
printf("没有子文件夹\n");
goto over;
}
if(strcmp(dirs.dir[i],".")==0||strcmp(dirs.dir[i],"..")==0||strcmp(dirs.dir[i],"\\")==0)
p=present;
else
{
p=present->child;
while(p!=NULL)
{
if(p->type==F)
{
p=p->rightbrother;
continue;
}
if(strcmp(p->filename,dirs.dir[dirs.i-1])==0)
break;
p=p->rightbrother;
}
if(p==NULL)
{
strcat(tempurl,"\\");
strcat(tempurl,(cmd+dc));
printf("无效的路径 - %s\n",tempurl);
printf("没有子文件夹\n");
goto over;
}
}
next:
printf("文件夹 PATH 列表\n");
printf("卷的序列号码为 0006EEA4 ");
switch(pd.p)
{
case 0: printf("F858:4A70\nC:.\n"); break;
case 1: printf("4812:9B67\nD:.\n"); break;
case 2: printf("18C3:4A5B\nE:.\n"); break;
case 3: printf("1472:2FF7\nF:.\n"); break;
}
tree(p,n);
over:
outputUrl();
}
int filesystem::mohupipei(char ch[])
{
char name[40];
int i=0,j=0,star=0;
strcpy(name,dirs.dir[dirs.i-1]);
while(ch[i]!='\0'&&name[j]!='\0')
{/*
if(ch[i]=='.'||name[j]=='.')
{
if(ch[i]==name[j])
{
i++;
j++;
continue;
}
else break;
}*/
if(star==1)//上一个字符是*
{
star=0;
if(name[j]=='.')
{
while(ch[i]!='\0'&&ch[i]!='.'){i++;}
if(ch[i]=='\0')
break;
i++;
j++;
continue;
}
if(name[j]=='?')
{
i++;
j++;
star=0;
continue;
}
while(ch[i]!=name[j]&&ch[i]!='\0')
{
i++;
}
if(ch[i]!='\0')
{
i++;
j++;
star=0;
continue;
}
else break;
}
else if(ch[i]==name[j]||name[j]=='?')
{
i++;
j++;
continue;
}
else if(name[j]=='*')
{
j++;
star=1;
}
else break;
}
if(star==1)
return 1;
if(ch[i]=='\0'&&name[j]=='\0')
return 1;
return 0;
}
int filesystem::spaceDistribute(int n)
{
int i,first=-1,f,j=0;
for(i=0;i<1000;i++)
{
if(space[i]==0)
{
first=i;
space[i]=1;
j=1;
break;
}
}
f=first;
if(f!=-1)
{
for(i;i<1000;i++)
{
if(j==n)
break;
if(space[i]==0)
{
fat[f]=i;
f=i;
space[i]=1;
j++;
}
}
if(j<n)
{
printf("磁盘空间不足\n");
return -1;
}
}
return first;
}
void filesystem::weishitu()
{
int i;
for(i=0;i<1000;i++)
{
if(i%10==0)
printf("\n");
printf("%d ",space[i]);
}
outputUrl();
}
void filesystem::outFat()
{
int i;
for(i=1;i<1001;i++)
{
if(i%10==0)
printf("\n");
printf("%d ",fat[i-1]);
}
outputUrl();
}
int filesystem::back(int first,int n)
{
int i=0,f,t;
f=first;
t=f;
for(i;i<n;i++)
{
space[f]=0;
f=fat[f];
fat[t]=-1;
t=f;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -