📄 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 + -