www.pudn.com > FAT32.rar > 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;is_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;is_pc*16;i++) 
	{ 
		 
		flag=1; 
		for(j=0;jextend[j]) 
			{ 
				flag=0; 
				break; 
			} 
		} 
		if(flag==1) 
		{ 
			for (j=1;jfilename[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