#include <stdlibh>
#include <stdioh>
#define NFIELDS 5
#define TRUE 1
#define FALSE 0
/ DBF文件头结构 /
struct dbf_head{
char vers;
unsigned char yy,mm,dd;
unsigned int no_recs;
unsigned short head_len,rec_len;
char reserved[20];
};
/ DBF字段描述结构 /
struct field_element{
char field_name[11];
char field_type;
unsigned int offset;
unsigned char field_length;
unsigned char field_decimal;
char reserved1[2];
char dbaseiv_id;
char reserved2[10];
char production_index;
};
char dbf_fields_name[NFIELDS]={
"a", "b","c","d","e"
};
/ 全局变量 /
struct dbf_head file_head;
struct field_element fields;
int length;
unsigned int offset;
/ 整形数字节顺序改变函数 /
void revert_unsigned_short(unsigned short a)
{
unsigned short left,right;
left=right=a;
a=((left&0x00ff)<<8)|((right&0xff00)>>8);
}
void revert_unsigned_int(unsigned int a)
{
unsigned int first,second,third,forth;
first=second=third=forth=a;
a=((first&0x000000ff)<<24)|((second&0x0000ff00)<<8)|
((third&0x00ff0000)>>8)|((forth&0xff000000)>>24);
}
/ 主函数代码 /
void main()
{
register int i,j;
FILE fp_dat;
char buffer;
char allspace;
int fields_count, matched=FALSE;
unsigned int counts;
/ 打开dbf文件 /
if((fp_dat=fopen("adbf","rb"))==NULL){
fprintf(stderr,"Cannot open dbf file to read!\n");
exit(1);
}
/ 读取表头纪录 /
fseek(fp_dat,0L,SEEK_SET);
fread((void)&file_head,sizeof(struct dbf_head),1,fp_dat);
revert_unsigned_int(&file_headno_recs);
revert_unsigned_short(&file_headhead_len);
revert_unsigned_short(&file_headrec_len);
/ 计算字段数 /
fields_count=(file_headhead_len-sizeof(struct dbf_head)-1-263)/sizeof(struct field_element);
/ 开辟存储字段子记录的空间 /
if((fields=(struct field_element)malloc(sizeof(struct field_element)fields_count))==NULL){
fprintf(stderr,"Cannot allocate memory for fields array !\n");
fclose(fp_dat);
exit(2);
}
/ 开辟存储一条数据记录的空间 /
if((buffer=(char)malloc(sizeof(char)file_headrec_len))==NULL){
fprintf(stderr,"Cannot allocate memory for record buffer!\n");
fclose(fp_dat);
exit(3);
}
/ 开辟一个全为空格的纪录,以便后面做比较 /
if((allspace=(char)malloc(sizeof(char)file_headrec_len))==NULL){
fprintf(stderr,"Cannot allocate memory for all_space record buffer!\n");
fclose(fp_dat);
exit(4);
}
else{
memset((void)allspace,'\x20',file_headrec_len-1);
allspace[file_headrec_len]='\0';
}
/ 读取所有的字段子记录,调整整形数的字节顺序 /
fread((void)fields,sizeof(struct field_element),fields_count,fp_dat);
for(i=0;i<fields_count;i++)
revert_unsigned_int(&fields[i]offset);
/ 计算各个字段的字节偏移量,第一字节为删除标记 /
fields[0]offset=1;
for(i=1;i<fields_count;i++)
fields[i]offset=fields[i-1]offset+(unsigned short)fields[i-1]field_length;
/ 开辟存储字段长度和偏移量的数组 /
length=(int)malloc(sizeof(int)fields_count);
offset=(unsigned int)malloc(sizeof(unsigned int)fields_count);
if(length==NULL||offset==NULL){
fprintf(stderr,"Cannot allocate memory for array length or offset\n");
exit(-1);
}
/ 找到所需字段的偏移量和长度,如果没有相应字段,程序退出 /
for(i=0;i<NFIELDS;i++)
{
for(j=0;j<fields_count;j++)
{
if(strcmp(dbf_fields_name[i],fields[j]field_name)==0)
{
offset[i]=fields[j]offset - 1;
length[i]=fields[j]field_length;
matched=TRUE;
break;
}
if(!matched){
fprintf(stderr,"dbf file structure is invalid, field %s not found\n", dbf_fields_name[i]);
exit(-1);
}
else
matched=FALSE;
}
}
/ 定位文件指针到数据记录的开始位置 /
fseek(fp_dat,(long)file_headhead_len,SEEK_SET);
/ 读取每条记录的字段数据 /
for(counts=0;counts<file_headno_recs;counts++)
{
/ 如果有删除标记,跳到下一条记录 /
if(fgetc(fp_dat)==(int)'\x2a')
{
fseek(fp_dat,(int)file_headrec_len-1,SEEK_CUR);
continue;
}
fread((void)buffer,(int)file_headrec_len-1,1,fp_dat);
buffer[file_headrec_len]='\0';
/去掉全为空格的记录行/
if(strcmp(buffer,allspace)==0)
continue;
}
fclose(fp_dat);
/ 释放开辟的空间 /
free(buffer);
free(allspace);
free(offset);
free(length);
}
解决方法:
1先查看数据库文件名后缀名,根据后缀名判断是哪一种数据库
Access (mdb)
MSSql (mdf)
Paradox(DB)
Oracle(DBF ora 表空间数据文件)
dBase(DBF)
FoxPro(DBF)
MS Works(wdb)
db2(索引数据 inx 大对象 lb, dms表空间)
2找到对应的数据库,然后需要在该数据库客户端下才能打开。
具体 *** 作如下:(电脑必须安装sql server 2008)
点击“开始”,“程序”,打开SQL sever management studio
点击“连接”连接到服务器
在对象资源管理器中找到“数据库”,右键单击,选择“附加”
在附加数据库对话框中点击“添加”
找到mdf文件所在的地方,选中,点击“确定”
附加数据库中出现选中的mdf文件数据库,点击“确定”
添加成功,在“数据库”中可以看到刚刚添加的数据库。
用Access打开数据库文件,可以有4种选择:打开、以只读方式打开、以独占方式打开、以独占只读方式打开。
打开Access数据库的 *** 作步骤如下:
1)打开“文件”菜单,选择“打开”命令,d出“打开”窗口。
2)在“打开”窗口,选定要打开数据库文件。 在“打开”按钮的右侧,有一个向下箭头,单击它将d出一个菜单,如图所示:
首先你撸起衣袖准备耐心的开始工作吧。下面是我的想法。
1先搜索一下百度究竟有多少种数据库。分别对应的后缀名又是什么。记录好
2把这个数据库的后缀一个个的改。然后按照该种数据库的恢复数据库文件方法一个个的尝试。
3运气好的话或许或许经过你的努力终于看到效果。运气不好的话那就没办法咯。
当然你在进行第2个的时候你最好先搜集下电脑上的一些可能暴露他是哪种数据库文件的信息。自己试着分析一些可能是哪个程序的产物。可能是那种数据库的可能性大。然后从可能性大的开始找。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)