📄 虚拟文件系统.cpp
字号:
{
ifstream input_file;
ofstream output_file;
int i=0,id1=-1,j=0,id2=-1;
//在ufdlist中查找filename1
for(;i<16;i++){
if(strcmp(ufdlist[i].filename,filename1)==0)
{
id1=i;
}
}
if(id1==-1){//在ufdlist没有找到filename1
cout<<"所需复制的源文件不存在,不能复制!\n";
return;
}
else
{
//原文件存在,查找目标文件是否在盘快中
id2=-1;
for(i=0;i<16;i++){
if(strcmp(ufdlist[i].filename,filename2)==0)
{
id2=i;
break;
}
}
if(id2!=-1)
{
char zh;
cout<<"目标文件已经存在,是否覆盖?y/n \n";
cin>>zh;
if(zh=='n')return;
ufdlist[id2].mode =ufdlist[id1].mode ;
ufdlist[id2].length =0 ;
}
if(id2==-1)
//在ufdlist没有找到filename2
{//cout<<"请先创建"<<filename2<<"文件!\n";return;
create(filename2,ufdlist[id1].mode);
close(filename2);
for(i=0;i<16;i++)
{
if(strcmp(ufdlist[i].filename,filename2)==0)
{
id2=i;
}
}
}
//else{
input_file.open("disk.txt",ios::binary|ios::ate);
output_file.open("disk.txt",ios::binary|ios::ate);
input_file.seekg(ufdlist[id1].addr*513,ios::beg);
output_file.seekp(ufdlist[id2].addr*513,ios::beg);
char a;
int address1=ufdlist[id1].addr;
int address2=ufdlist[id2].addr;
input_file.get(a);
while(a!='\0')
{
if(a!='\n')
{
output_file.put(a);
}
else{
address1=disklist[address1].next;
if(disklist[address2].next==0)
{
disklist[address2].next=getdisk();
// ufdlist[id2].length++;
}
address2=disklist[address2].next;
input_file.seekg(address1*513,ios::beg);
output_file.seekp(address2*513,ios::beg);
}
input_file.get(a);
}
}
output_file.put('\0');
ufdlist[id2].length=ufdlist[id1].length ;
cout<<"拷贝文件"<<filename1<<"->"<<filename2<<"成功!\n";
back_disklist();
back_mfd();
back_ufd();
// close(filename2);
input_file.close();
output_file.close();
}
//显示文件内容
void type(char filename[])
{
int i=0,id1=-1,block;
char ch;
ifstream input_file;
for(;i<16;i++){
if(strcmp(ufdlist[i].filename,filename)==0)
{
id1=i;
}
}
if(id1==-1){//在ufdlist找到
cout<<"该文件不存在,不能显示文件!\n";
return;
}
else
{
input_file.open("disk.txt",ios::binary|ios::ate);
if(!input_file)
{
cout<<"file open error!\n";
return;
}
block=ufdlist[id1].addr;
// cout<<"block"<<block<<endl;
input_file.seekg(block*513,ios::beg);
input_file.get(ch);
while(ch!='\0')
{
cout<<ch;
input_file.get(ch);
if(ch=='\n')
{
block=disklist[block].next;
input_file.seekg(block*513+1,ios::beg);
input_file.get(ch);
}
}
cout<<'\n';
}
}
//改变密码
void passwd(char pass1[],char pass2[]){
int i=0,id1=-1;
//在mfdlist中查找
for(;i<16;i++){
if(strcmp(mfdlist[i].username,cur_user)==0)
{
id1=i;
}
}
if(strcmp(mfdlist[id1].password,pass1)!=0)
{
cout<<"您输入的旧密码错误,无法改变密码!\n";
return;
}
else
{
strcpy(mfdlist[id1].password,pass2);
cout<<"修改密码成功!请记住您的新密码!\n";
back_disklist();
back_mfd();
back_ufd();
return;
}
}
//删除文件
void delet(char filename[])
{
int i=0,id1=-1,j=0,id2=-1,block;
//在ufdlist中查找
for(;i<16;i++){
if(strcmp(ufdlist[i].filename,filename)==0)
{
id1=i;
}
}
if(id1==-1){//在ufdlist没有找到
cout<<"该文件不存在,不能删除!\n";
return;
}
else
{//在uoflist中查找
for(;j<16;j++)
{
if(strcmp(uoflist[j].filename,filename)==0)
{
id2=j;
}
}
if(id2!=-1)
{//清除uoflist中的表项
strcpy(uoflist[id2].filename,"");
}
//归还文件的存贮区域
block=ufdlist[id1].addr;
while(disklist[block].next!=0)
{
disklist[block].flag='0';
block=disklist[block].next;
}
disklist[block].flag='0';
//ufdlist中清除该项
strcpy(ufdlist[id1].filename,"");
cout<<"删除文件成功!\n";
back_disklist();
back_mfd();
back_ufd();
return;
}
}
//打开文件
void open(char filename[],int mod){
int i=0,id1=-1,j=0,id2=-1;
for(;i<16;i++){
if(strcmp(ufdlist[i].filename,filename)==0)
{
id1=i;
}
}
if(id1==-1){
cout<<"该文件不存在,不能打开!\n";
return;
}
else{
//在uoflist中查找
for(;j<16;j++){
if(strcmp(uoflist[j].filename,filename)==0)
{
id2=j;
}
}
if(id2!=-1)//在uoflist中找到
{
if(uoflist[id2].state==0)
cout<<"文件正在建立不能打开!\n";
else
cout<<"文件已经打开!\n";
return;
}
else//没有在uoflist中找到
{
if(ufdlist[id1].mode!=mod)
{
cout<<"文件属性不合法!不能打开文件!\n";
return;
}
else
{//一下找到uoflist中的一个空表项登记该文件信息
for(i=0;i<16;i++)
{
if(strcmp(uoflist[i].filename,"")==0)
break;
}
strcpy(uoflist[i].filename,ufdlist[id1].filename);
uoflist[i].state=1;
uoflist[i].length=ufdlist[id1].length;
uoflist[i].mode=ufdlist[id1].mode;
uoflist[i].addr=ufdlist[id1].addr;
uoflist[i].readptr=0;
cout<<"打开文件成功!\n";
ifstream input_file;
input_file.open("disk.txt",ios::binary|ios::ate);
input_file.seekg (ufdlist[id1].addr*513,ios::beg);
int address1=ufdlist[id1].addr;//文件开始盘块号;
char c;
input_file.get(c);
int x=0;
while(c!='\0')//查找文件末尾,写指针定义为相对最后的盘块的偏移量;
{
if(c!='\n')
{
x++;
}
else
{
input_file.seekg (address1*513,ios::beg);
x=0;
if(disklist[address1].next !=0)
address1=disklist[address1].next ;
}
input_file.get(c);
}
uoflist[i].writeptr=x;
return;
}
}
}
}
//将buffer中的nbytes写入到写指针指定的位置。
void write(char filename[],char buffer[],int nbyte)
{
ofstream outfile;
for(int i=0;i<16;i++)
{
if(strcmp(uoflist[i].filename,filename)==0)
break;
}
if(i==16)
{
cout<<"该文件没有打开!\n";
return;
}
if(uoflist[i].mode==0)
{
cout<<"文件只读!\n";
return;
}
outfile.open("disk.txt",ios::binary|ios::ate);
if(!outfile)
{
cout<<"open file disk.txt error!\n";
return;
}
int address;//记录文件最后的盘块号;
address=uoflist[i].addr;
while(disklist[address].next!=0)
address=disklist[address].next;
outfile.seekp(address*513+uoflist[i].writeptr,ios::beg);
long cur_pos;
for(int j=0;j<nbyte;j++)
{
cur_pos=outfile.tellp();
if((cur_pos+1)%513!=0)
{
outfile.put(buffer[j]);
uoflist[i].length ++;
}
else
{
disklist[address].next=getdisk();
// uoflist[i].writeptr=0;
outfile.seekp(disklist[address].next*513,ios::beg);
j--;
}
for(int k=0;k<16;k++)
if(strcmp(ufdlist[k].filename ,filename)==0)
break;
ufdlist[k].length =uoflist[i].length;
}
outfile.put('\0');
uoflist[i].writeptr=(uoflist[i].writeptr+nbyte)%513;
cout<<"当前文件读指针位置为"<<uoflist[i].writeptr<<endl;
cout<<"成功写入文件!\n";
back_disklist();
back_mfd();
back_ufd();
outfile.close();
return;
}
//将文件当前读指针开始的nbytes 读入buffer 字符串数组中
void read(char filename[],char buffer[], int nbyte)
{
int i=0,id=-1,block,offset;
ifstream infile;
for(;i<16;i++)
{
if(strcmp(uoflist[i].filename,filename)==0)
{
id=i;
}
}
if(uoflist[i].mode==1)
{
cout<<"文件只读!\n";
return;
}
if(id==-1){
cout<<"该文件还没有打开,不能读出!\n";
return;
}
block=uoflist[id].addr;
offset=uoflist[id].readptr;
infile.open("disk.txt",ios::binary|ios::ate);
if(!infile)
{
cout<<"open file disk.txt error!\n";
return;
}
infile.seekg(block*513+offset,ios::beg);
long cur_addr=0;
int index=0;
for(i=0;i<nbyte;i++)
{
if((cur_addr+1)%513!=0)
{
infile.get(buffer[i]);
if(buffer[i]=='\0')
break;
}
else
{
block=disklist[block].next ;
if(block==0)
break;
index=disklist[block].next-block;
infile.seekg(block*513,ios::beg);
i--;
}
}
buffer[i]='\0';
uoflist[id].readptr=index*513+i+uoflist[id].readptr;
cout<<"成功读取文件内容如下:"<<buffer<<endl;
infile.close();
}
//列出该用户下所有文件, 输出格式:文件名 mode length startAdd
void dir()
{
int i=0,total=0,k=0;
cout<<cur_user<<"的文件目录:\n";
for(;i<16;i++){
if(strcmp(ufdlist[i].filename,"")!=0)
{
total++;
k=strlen(ufdlist[i].filename);
k=14-k;
//cout<<'\t';
while(k>0)
{
cout<<' ';
k--;
}
cout<<ufdlist[i].filename<<" ";
switch(ufdlist[i].mode)
{
case 0:
cout<<"--r--";
break;
case 1:
cout<<"--w--";
break;
case 2:
cout<<"-r-w-";
break;
default:
cout<<"error";
break;
}
cout<<"\t"<<ufdlist[i].length<<"Byte(s)"<<"\t"<<ufdlist[i].addr<<endl;
}
}
cout<<"\t\t\t共有文件"<<total<<"个\n";
}
//用户登出
void logout()
{
back_disklist();
back_mfd();
back_ufd();
for(int i=0;i<16;i++)
{
strcpy(uoflist[i].filename,"");
strcpy(ufdlist[i].filename ,"");
ufdlist[i].addr =0;
ufdlist[i].length =0;
ufdlist[i].mode =0;
}
cout<<cur_user<<"您已经退出系统!\n";
return;
}
//系统帮助,显示系统命令
void help()
{
cout<<" 系统命令用法如下:\n";
cout<<"\tchmod\tfilename\tmode\t改变文件权限\n";
cout<<"\t\t(mode: 0-read_only; 1-write_only; 2-read_write)\n";
cout<<"\tchown\tfilename\tnew_owner\t改变文件拥有者\n";
cout<<"\tmy\tsrcFile\t\tdesFile\t改变文件名\n";
cout<<"\tcopy\tsrcFile\t\tdesFile\t文件拷贝\n";
cout<<"\ttype\tfilename\t\t显示文件内容\n";
cout<<"\tpasswd\toldPwd\t\tnewPwd\t修改用户口令\n";
cout<<"\tlogin\tuserName\tpwd\t用户登陆\n";
cout<<"\tlogout \t \t \t 用户登出\n";
cout<<"\tcreate\tfilename\tmode\t建立文件\n";
cout<<"\t\t(mode: 0-read_only; 1-write_only; 2-read_write)\n";
cout<<"\tdelet\tfilename\t \t删除文件\n";
cout<<"\topen\tfilename\tmode\t打开文件\n";
cout<<"\t\t(mode: 0-read_only; 1-write_only; 2-read_write)\n";
cout<<"\tclose\tfilename\t\t关闭文件\n";
cout<<"\twrite\tfilename buffer nbytes 将buffer中的nbytes写入文件\n";
cout<<"\t\t(输入的字符之间不能有空格!)\n";
cout<<"\tread\tfilename nbyte 将文件读指针开始的nbyte读入buffer字符串中\n";
cout<<"\thelp\t\t\t \t显示本系统命令\n";
cout<<"\tdir \t 列出该用户下所有文件\n\t\t(输出格式:文件名 mode length startAdd)\n";
}
//运行系统
void run()
{
int mod,nbyte,ext=1;
while(1){
cout<<cur_user<<">";
cin>>command;
if(strcmp(command,"chmod")==0){
cin>>parameter1>>mod;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\nlogin 用户名 密码\n";
continue;
}
chmod(parameter1,mod);
}
else if(strcmp(command,"chown")==0){
cin>>parameter1>>parameter2;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\nlogin 用户名 密码\n";
continue;
}
chown(parameter1,parameter2);
}
else if(strcmp(command,"my")==0){
cin>>parameter1>>parameter2;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
my(parameter1,parameter2);
}
else if(strcmp(command,"copy")==0){
cin>>parameter1>>parameter2;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
copy(parameter1,parameter2);
}
else if(strcmp(command,"type")==0){
cin>>parameter1;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
type(parameter1);
}
else if(strcmp(command,"passwd")==0){
cin>>parameter1>>parameter2;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
passwd(parameter1,parameter2);
}
else if(strcmp(command,"create")==0){
cin>>parameter1>>mod;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
create(parameter1,mod);
}
else if(strcmp(command,"delet")==0){
cin>>parameter1;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
delet(parameter1);
}
else if(strcmp(command,"open")==0){
cin>>parameter1>>mod;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
open(parameter1,mod);
}
else if(strcmp(command,"close")==0){
cin>>parameter1;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
close(parameter1);
}
else if(strcmp(command,"dir")==0){
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
dir();
}
else if(strcmp(command,"read")==0){
cin>>parameter1>>nbyte;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
read(parameter1,parameter2,nbyte);
}
else if(strcmp(command,"write")==0){
cin>>parameter1>>parameter2>>nbyte;
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
write(parameter1,parameter2,nbyte);
}
else if(strcmp(command,"logout")==0){
if(strcmp(cur_user,"")==0)
{
cout<<"请先登陆!\n login 用户名 密码\n";
continue;
}
logout();
ext--;
strcpy(cur_user,"");
cout<<"如果还有其他用户登陆,请输入login 用户名 密码\n";
cout<<"想退出输入 exit \n";
}
else if(strcmp(command,"help")==0){
help();
}
else if(strcmp(command,"login")==0){
if(ext==1)
{cout<<"请先注销当前用户"<<cur_user<<"!\n";}
else{
cin>>parameter1>>parameter2;
login(parameter1,parameter2);
ext++;
}
}
else if(strcmp(command,"exit")==0){
exit(0);
}
else
{cout<<command<<"不是本系统的命令!\n";
continue;
}
}
}
void main()
{
char f;
cout<<" =================================================\n";
cout<<" 欢迎进入二级目录的文件系统!!!\n";
cout<<" =================================================\n";
cout<<"系统格式化按f,否则按其它:"<<endl;
cin>>f;
if(f=='f') {
format();
}
else{
initial_mfd();//主文件目录初始化
}
initial_disk();//初始化disklist表
cout<<"您必须首先使用login 用户名 密码 命令登录才能正常使用\n>";
log: cin>>command;
if(strcmp(command,"login")==0)
{
cin>>parameter1>>parameter2;
login(parameter1,parameter2);//用户登录
}
else
{
cout<<"请使用login命令登陆!\n>";
goto log;
}
run();//运行系统
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -