⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydisk.cpp

📁 申请一个10M的文件空间虚拟成一个磁盘
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -