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

📄 fat32.cpp

📁 恢复误删除或误格式化且文件格式为fat32的数据。
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int str(unsigned char *ptr)
{
	int i = 0;
	while (1)
	{
		if(ptr[i] == '\0')
			break;
		i++;
	}
	return i;
}

unsigned char *strc(unsigned char *str1,unsigned char *str2)
{
	int i = 0;
	//int t = str(b);
	while(1)
	{
		if(str1[i] == '\0'){
			for(int j = 0;str2[j] != '\0' ; j++,i++)
				str1[i] = str2[j];
			str1[i] = '\0';
			break;
		}
		i++;

	}
	return str1;
}
// BPB表
typedef struct	BPB{
	unsigned char laji1[11];				//前无关部分
	unsigned char b_ps[2];               //每扇区字节数
	unsigned char s_pc;                  //每簇扇区数
	unsigned char s_bl[2];               //保留扇区数
	unsigned char fat_s;                 //FAT表的数目
	unsigned char free1[2];				//闲置				
	unsigned char free2[2];				//闲置	
	unsigned char sign;					//磁盘介质描述符
	unsigned char free3[2];				//闲置	
	unsigned char s_pz[2];				//每个磁道的扇区数
	unsigned char head[2];				//磁头数
	unsigned char hide_s[4];		//隐藏扇区数
	unsigned char l_t_s[4];				//逻辑驱动器总扇区区
	unsigned char s_pfat[4];				//每个FAT表的扇区数
	unsigned char baoliu1[4];			//保留
	unsigned char b_startc[4];			//根目录起始簇号
	unsigned char sys_sign[2];			//系统标记
	unsigned char s_pyindao;				//每个引导记录的扇区数
	unsigned char baoliu2[13];			//保留
	unsigned char laji2[488];			//后无关部分
};
// FDT表 
typedef struct FDT{
	unsigned char filename[8];
	unsigned char extend[3];
	unsigned char charactor;
	unsigned char dos[10];
	unsigned char time[2];
	unsigned char date[2];
	unsigned char startc[2];
	unsigned char l_file[4];
};
void main()
{
	FILE *fp,*fp1;
	BPB *bt1;
	FDT *ft1[9999];
	int i,j,flag,baoliu,b_ps,s_pfat;
	unsigned char f_name[26];
	unsigned char f_ex[4];
	int flength;  //文件名长度
	int exlength; //文件扩展名长度
	int startc,flong;


	bt1=(BPB *)malloc(sizeof(BPB));

	if((fp=fopen("newd2.gho","rb"))==NULL)
	{
		printf("open error\n");
		exit(0);
	}
	
	fseek(fp,3072,0);

	fread(bt1,1,512,fp);

	baoliu=(bt1->s_bl[1]<<8)|bt1->s_bl[0];
	b_ps=(bt1->b_ps[1]<<8)|bt1->b_ps[0];
	s_pfat=(bt1->s_pfat[3]<<24)|(bt1->s_pfat[2]<<16)|(bt1->s_pfat[1]<<8)|bt1->s_pfat[0];

	fseek(fp,(baoliu-1)*512,1);                 //跳过保留扇区
	fseek(fp,bt1->fat_s*s_pfat*512,1);          //跳过两个FAT表

	for (i=0;i<bt1->s_pc*16;i++)
	{
		ft1[i]=(FDT *)malloc(sizeof(FDT));
		if(ft1[i] == NULL)
		{
			printf("申请失败\n");
			exit(1);
		}
		fread(ft1[i],1,32,fp);
	}
	printf("请输入文件名:\n");
	scanf("%s",f_name);
	flength=str(f_name);
	printf("请输入文件扩展名:\n");
	scanf("%s",f_ex);
	exlength=str(f_ex);
// 	int file_name[8];
// 	int file_ex[3];
// 	for(i=0;i<8;i++)
// 		file_name[i] = f_name[i];
// 	for(i=0;i<3;i++)
// 		file_ex[i] = file_ex[i];
	//unsigned char f_n1[30]; 
	//unsigned char f_ex1[10] = puts(f_ex);

	for (i=0;i<bt1->s_pc*16;i++)
	{
		
		flag=1;
		for(j=0;j<exlength;j++)			//3的位置原为文件扩展名长度
		{

			if(f_ex[j]!=ft1[i]->extend[j])
			{
				flag=0;
				break;
			}
		}
		if(flag==1)
		{
			for (j=1;j<flength;j++)     //7的位置原为文件名长度
			{
				if(f_name[j]!=ft1[i]->filename[j])
				{
					flag=0;
					break;
				}
			}
		}
		if (flag==1)
			break;
	}
	
	if (flag==0)
	{
		printf("您所要的文件未找到!\n");
		exit(0);
	}
	else{
		printf("找到你要找的文件,下面帮你自动恢复!\n");
	}

	startc=(ft1[i]->startc[1]<<8)|ft1[i]->startc[0];
	flong=(ft1[i]->l_file[3]<<24)|(ft1[i]->l_file[2]<<16)|(ft1[i]->l_file[1]<<8)|ft1[i]->l_file[0];
	//b_ps = bt1->b_ps;
	int s_pc = bt1->s_pc;
	int t = (startc-3)*b_ps*s_pc;
	fseek(fp,t,1);//跳到文件起始簇


	unsigned char c2[2] = ".";
	strc(f_name,c2);
	strc(f_name,f_ex);
	unsigned char f[33]="d:\\rf\\";
	strc(f,f_name);
	if ((fp1=fopen("d:\\rf\\a.mpp","wb+"))==NULL)
	{
		printf("指定文件找不到路径!\n");
		exit(1);
	}

	char c1;
	for (j=0;j<flong;j++)
	{
		c1=fgetc(fp);
		fputc(c1,fp1);
	}

	if(fclose(fp))
	{
		printf("Close error!\n");
		exit(1);
	}
	if(fclose(fp1))
	{
		printf("恢复失败!\n");
		//printf("Close error!\n");
		exit(1);
	}
	else {
		printf("恢复成功!谢谢你的使用");

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -