最近在做关于ntfs文件系统的深度分析功能,要求是,一张源盘,一张裸盘,要求进行一次基础同步后,向源盘中添加文件,执行深度分析,对两张盘中不相同的数据进行同步。
最开始的想法是,在基础同步的基础上加一个函数判断,从两张盘的相同位置读取同样大小的数据,相同就跳过本次循环,不同就将源盘中的数据写入到裸盘中。
简单来说,分别调用open函数打开两个块设备。分别从两个块设备中读取数据,对比,相同就跳过,不同就写入。
fd_in = open(/dev/vdd1,O_RDWR);//源盘
fd_out = open(/dev/vdd1,O_RDWR);//裸盘
之后写一个对比函数,对比从块设备中读取的数据是否相同;
static int cmo_cluster_in_buff(u32 csize)
{
char *buffer_in;
char *buffer_out;
void *fd_in = vol->dev;
buffer_in = (char *)ntfs_malloc(csize);
buffer_out = (char *)ntfs_malloc(csize);
read_all(fd_in,buffer_in,csize);
if(read(fd_out,buffer_out,csize) != 4096)
{
printf("read_put error\n");
}
if(memcmp(buffer_in,buffer_out,csize) == 0)
{
free(buffer_in);
free(buffer_out);
return 1;
}
else
{
lseek(fd_out,-csize,SEEK_CUR);
write(fd_out,buffer_in,csize);
free(buffer_in);
free(buffer_out);
return 0;
}
}
重点就在于,lseek这个函数,你调用read()读取了csize(4096)个字节到buffer_In中,他的文件指针就指向了读取完这4096个字节之后的位置,之后在调用write()写入的一直是之后的位置,而不是开始读取时的位置。需要调用lseek去向前偏移4096个字节才算真正写入到应该写入的位置。
就这一个问题,困扰了我一周(当然任务也没多急,我能多划划水就多划划水,反正日报就写demo测试问题排查就好)