📄 mydisk.cpp
字号:
lastblock=disk->disk.blocksize;
}
fread(data,lastblock,1,file);
if(i==1)
{(disk->fcbs+m)->startblock=k;}
else
{(disk->fat+n)->fats=k;}
(disk->fat+k)->fats=-1;
fseek(fp,(1+disk->disk.FATblocks+disk->disk.dirblocks+k)*disk->disk.blocksize,0);
fwrite(data,lastblock,1,fp);
//文件写入完成//
disk->disk.freesize-=filesize;
disk->disk.idleblocks-=fileblocks;
disk->disk.realfiles++;
disk->disk.files++;
free(data);
fclose(file);
printf("一个文件复制成功.\n");
return(0);
};
int copy(DISKINFO *disk,FILE *fp,char *name1,char *name2)
{
unsigned int m;
unsigned int n;
unsigned int k;
unsigned int h;
unsigned int l;
unsigned int lastblock;
char *data;
char t;
for(m=0;m<disk->disk.fcbsnum;m++) //寻找文件//
if((disk->fcbs+m)->status==1&&(strcmp((disk->fcbs+m)->name,name1))==0)
break;
if(m>=disk->disk.fcbsnum)
{
printf("文件不存在.\n");
return(-1);
};
if(name2[0]=='\0')
{
strcpy(name2,"new_");
strcat(name2,name1);
}
if(disk->disk.freesize<(disk->fcbs+m)->size) //判断是否有足够空间//
{
printf("可用空间不足.\n");
return(-1);
}
for(n=0;n<disk->disk.fcbsnum;n++) //判断虚拟磁盘上是否有同名文件存在//
{
if((disk->fcbs+n)->status==1&&(strcmp((disk->fcbs+n)->name,name2)==0))
{
printf("文件%s已存在,是否替换(Y/N)?",name2);
scanf("%c",&t);
getchar();
if(t!='y'&&t!='Y')
{
printf("文件%s已存在,复制失败.\n",name2);
return(-1);
}
else
{
del(disk,name2);
break;
}
}
}
if(disk->disk.files>=disk->disk.fcbsnum) //判断目录是否已满//
{
printf("目录已满,操作无法完成.\n");
return(-1);
}
else //找到空目录n//
{
for(n=0;n<=disk->disk.fcbsnum;n++)
{
if((disk->fcbs+n)->status==0)
break;
}
}
(disk->fcbs+n)->status=1;
(disk->fcbs+n)->size=(disk->fcbs+m)->size;
strcpy((disk->fcbs+n)->name,name2);
if((disk->fcbs+m)->size==0) //如果要复制的文件为空//
{
disk->disk.files++;
(disk->fcbs+n)->startblock=-1;
printf("复制成功,文件大小为0B.\n");
return(0);
}
data=(char*)malloc(disk->disk.blocksize);
k=(disk->fcbs+m)->startblock;
lastblock=(disk->fcbs+m)->size%disk->disk.blocksize;
if(lastblock==0)lastblock=disk->disk.blocksize;
while((disk->fat+k)->fats!=-1)
{
fseek(fp,(1+disk->disk.FATblocks+disk->disk.dirblocks+k)*disk->disk.blocksize,0);
fread(data,disk->disk.blocksize,1,fp);
for(l=1;l<disk->disk.datablocks;l++)//寻找空闲块l//
{
if((disk->fat+l)->fats==0)
break;
}
if((disk->fcbs+m)->startblock==k) //第一块//
{
(disk->fcbs+n)->startblock=l;
}
else
{
(disk->fat+h)->fats=l;
}
h=l;
(disk->fat+l)->fats=-1;
fseek(fp,(1+disk->disk.FATblocks+disk->disk.dirblocks+l)*disk->disk.blocksize,0);
fwrite(data,disk->disk.blocksize,1,fp);
k=(disk->fat+k)->fats;
}
//写入最后一块//
fseek(fp,(1+disk->disk.FATblocks+disk->disk.dirblocks+k)*disk->disk.blocksize,0);
fread(data,lastblock,1,fp);
for(l=1;l<disk->disk.datablocks;l++)//寻找空闲块l//
{
if((disk->fat+l)->fats==0)
break;
}
if((disk->fcbs+m)->startblock==k) //第一块//
{
(disk->fcbs+n)->startblock=l;
}
else
{
(disk->fat+h)->fats=l;
}
(disk->fat+l)->fats=-1;
fseek(fp,(1+disk->disk.FATblocks+disk->disk.dirblocks+l)*disk->disk.blocksize,0);
fwrite(data,lastblock,1,fp);//文件写入完成//
disk->disk.freesize-=(disk->fcbs+m)->size;
disk->disk.idleblocks-=((disk->fcbs+m)->size/disk->disk.blocksize+(1&&(disk->fcbs+m)->size%disk->disk.blocksize));
disk->disk.realfiles++;
disk->disk.files++;
printf("一个文件拷贝成功.\n");
free(data);
return(0);
}
void dir(DISKINFO *disk) //显示目录信息//
{
unsigned int i;
printf("\n总文件个数:%d\n有效文件个数:%d\n\n",disk->disk.files,disk->disk.realfiles);
if(disk->disk.files!=0)
{
printf(" 文件名 文件大小\n");
for(i=0;i<disk->disk.fcbsnum;i++)
{
if((disk->fcbs+i)->status==1)
printf(" %-13s %-ldB\n",(disk->fcbs+i)->name,(disk->fcbs+i)->size);
}
}
};
int rename(DISKINFO *disk,char *name1,char *name2) //文件重命//
{
unsigned int m;
unsigned int n;
if(name1[0]=='\0'||name2[0]=='\0')
{
printf("Error\n");
return(-1);
}
for(m=0;m<disk->disk.fcbsnum;m++) //寻找文件//
if((disk->fcbs+m)->status==1&&(strcmp((disk->fcbs+m)->name,name1))==0)
break;
if(m>=disk->disk.fcbsnum)
{
printf("文件不存在.\n");
return(-1);
};
for(n=0;n<disk->disk.fcbsnum;n++) //寻找文件//
if((disk->fcbs+m)->status==1&&(strcmp((disk->fcbs+n)->name,name2))==0)
{
printf("文件%s已存在,重命名失败.\n",name2);
return(-1);
}
strcpy((disk->fcbs+m)->name,name2);//修改FCB//
printf("文件重命名成功.\n\n");
return(0);
};
void showdisk(DISKINFO *disk) //显示盘卷总信息//
{
printf("\n磁盘大小:%ldB(%dMB)\n已用空间:%ldB\n可用空间:%ldB\n空闲块数:%d\n总文件数:%d\n有效文件:%d\n磁盘块长:%d\n总块数 :%d\n盘块分配\n盘卷总信息:%d\nFAT:%d\n目录区:%d\n数据区:%d\n\n",
disk->disk.disksize,disk->disk.disksize/1048576l,disk->disk.disksize-disk->disk.freesize,
disk->disk.freesize,disk->disk.idleblocks,disk->disk.files,disk->disk.realfiles,disk->disk.blocksize,disk->disk.blocks,1,32,2,disk->disk.blocks-(1+disk->disk.FATblocks+disk->disk.dirblocks));
};
int cat(DISKINFO *disk,FILE *fp,char name[13]) //显示文件内容//
{
unsigned int m;
unsigned int k;
unsigned int lastblock;
char *data;
for(m=0;m<disk->disk.fcbsnum;m++) //寻找文件//
if((disk->fcbs+m)->status==1&&(strcmp((disk->fcbs+m)->name,name))==0)
break;
if(m>=disk->disk.fcbsnum)
{
printf("文件不存在.\n");
return(-1);
};
if((disk->fcbs+m)->size==0) //文件是否为空//
{
printf("文件大小为0B,内容为空.\n");
return(0);
}
data=(char*)malloc(disk->disk.blocksize+1);
k=(disk->fcbs+m)->startblock;
lastblock=(disk->fcbs+m)->size%disk->disk.blocksize;//计算文件最后一块大小//
if(lastblock==0)lastblock=disk->disk.blocksize;
while((disk->fat+k)->fats!=-1)//读入文件,并显示//
{
fseek(fp,(1+disk->disk.FATblocks+disk->disk.dirblocks+k)*disk->disk.blocksize,0);
fread(data,disk->disk.blocksize,1,fp);
*(data+disk->disk.blocksize)='\0';
printf("%s",data);
k=(disk->fat+k)->fats;
}
fseek(fp,(1+disk->disk.FATblocks+disk->disk.dirblocks+k)*disk->disk.blocksize,0);
fread(data,lastblock,1,fp);
*(data+lastblock)='\0';
printf("%s\n\n",data);
free(data);
return(0);
};
int save(DISKINFO *disk,FILE *fp)//保存虚拟磁盘,即将DISKINFO写入虚拟磁盘//
{
fseek(fp,0,0);
fwrite(&disk->disk,sizeof(DISK),1,fp);
fseek(fp,disk->disk.disksize,0);
fwrite(disk->fat,disk->disk.datablocks*sizeof(disk->fat),1,fp);
fseek(fp,disk->disk.blocksize*(1+disk->disk.FATblocks),0);
fwrite(disk->fcbs,disk->disk.fcbsnum*sizeof(FCB),1,fp);
return(0);
}
int opendisk(DISKINFO *disk,FILE *fp)//读入虚拟磁盘基本信息,即DISKINFO//
{
unsigned long disksize;
char c;
int t;
fseek(fp,0,0);
if((fread(&disk->disk,sizeof(DISK),1,fp))==0||disk->disk.blocksize!=disk->disk.blocksize)
{
printf("磁盘未格式化.是否格式化磁盘?(Y/N):");
scanf("%c",&c);
getchar();
if(c=='Y'||c=='y')
{
printf("Please enter the disk size(MB):");
scanf("%d",&t);
getchar();
disksize=1048576l*t;
fp=Format(fp,disksize);
printf("磁盘格式化成功.\n");
return(-1);
}
else
{
printf("磁盘未格式化.\n");
fp=Select();
return(-1);
}
}
disk->fat=(FAT*)malloc(disk->disk.datablocks*sizeof(FAT));
disk->fcbs=(FCB*)malloc(disk->disk.fcbsnum*sizeof(FCB));
fseek(fp,disk->disk.disksize,0);
fread(disk->fat,disk->disk.datablocks*sizeof(FAT),1,fp);
fseek(fp,disk->disk.blocksize*(1+disk->disk.FATblocks),0);
fread(disk->fcbs,disk->disk.fcbsnum*sizeof(FCB),1,fp);
printf("Open disk successfully\n");
return(0);
}
int command(DISKINFO *disk,FILE *fp)//命令解析//
{
char command[39];
char com[3][13];
char c;
unsigned int m;
while(1)
{
printf("X:\\>");
com[0][0]='\0';
com[1][0]='\0';
com[2][0]='\0';
gets(command);
sscanf(command,"%s%s%s",com[0],com[1],com[2]);
if(strcmp(com[0],"showdisk")==0)showdisk(disk);
else if(strcmp(com[0],"exit")==0||strcmp(com[0],"EXIT")==0)
{
save(disk,fp);
fclose(fp);
exit(0);
}
else if(strcmp(com[0],"help")==0||strcmp(com[0],"HELP")==0)
{
help();
}
else if(strcmp(com[0],"format")==0||strcmp(com[0],"FORMAT")==0)
{
printf("是否格式化磁盘?(Y/N):");
scanf("%c",&c);
getchar();
if(c=='Y'||c=='y')
{
free(disk->fat);
free(disk->fcbs);
fp=Format(fp,disk->disk.disksize);
printf("磁盘格式化成功.\n");
showdisk(disk);
break;
}
else continue;
}
else if(strcmp(com[0],"icopy")==0||strcmp(com[0],"ICOPY")==0)
{
icopy(disk,fp,com[1],com[2]);
}
else if(strcmp(com[0],"ocopy")==0||strcmp(com[0],"OCOPY")==0)
{
ocopy(disk,fp,com[1],com[2]);
}
else if(strcmp(com[0],"copy")==0||strcmp(com[0],"COPY")==0)
{
copy(disk,fp,com[1],com[2]);
}
else if(strcmp(com[0],"dir")==0||strcmp(com[0],"DIR")==0||strcmp(com[0],"ls")==0)
{
dir(disk);
}
else if(strcmp(com[0],"del")==0||strcmp(com[0],"DEL")==0)
{
printf("删除%s?(Y/N):",com[1]);
scanf("%c",&c);
getchar();
if(c=='Y'||c=='y')
if(del(disk,com[1])==0)
printf("一个文件删除成功.\n");
else
printf("文件删除失败.\n");
}
else if(strcmp(com[0],"fatinfo")==0)
{
printf("FCBS:\n");
for(m=0;m<disk->disk.fcbsnum;m++)
printf("%d",(disk->fcbs+m)->status);
printf("FAT:\n");
for(m=1;m<disk->disk.datablocks;m++)
printf("%4d",(disk->fat+m)->fats);
printf("\n");
}
else if(strcmp(com[0],"rename")==0||strcmp(com[0],"RENAME")==0)
{
rename(disk,com[1],com[2]);
}
else if(strcmp(com[0],"cat")==0||strcmp(com[0],"CAT")==0||strcmp(com[0],"type")==0)
{
cat(disk,fp,com[1]);
}
else if(strcmp(com[0],"save")==0||strcmp(com[0],"SAVE")==0)
{
save(disk,fp);
printf("保存成功.\n");
}
else if(com[0][0]=='\n')continue;
else printf("command not found\n");
}
return(0);
}
int _tmain(int argc, _TCHAR* argv[])
{
FILE *fp;
DISKINFO *disk;
disk=(DISKINFO*)malloc(sizeof(DISKINFO));
if(argc==1)
fp=Select();
else if(argc==2)
{
if((fp=fopen(argv[1],"rb+"))==NULL)
{
printf("Open disk failed\n");
fp=Select();
}
}
else
{
printf("Open disk error\n");
exit(0);
}
while(1)
{
if(opendisk(disk,fp)==-1)continue;
command(disk,fp);
}
fclose(fp);
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -