/*
*说明:把分区0-6写到block0.txt-block6.txt中
*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <string.h>
//各个分区的大小
#define SIZE_MTDBLOCK0 512*1024
#define SIZE_MTDBLOCK1 2560*1024 //kernel
#define SIZE_MTDBLOCK2 7104*1024 //rootfs
#define SIZE_MTDBLOCK3 16768*1024 //app
#define SIZE_MTDBLOCK4 5376*1024 //www
#define SIZE_MTDBLOCK5 384*1024 //para
#define SIZE_MTDBLOCK6 64*1024 //P2P
//记录写入文件偏移量
long int size=0;
//记录文本文件.txt的文件流指针
FILE *fb_txt=NULL;
void WriteFlash(long FlashSize,int num);
/*
*功能:把SourcePath路径下的文件拷贝到ReadBlock.txt中,大小为ReadSize
*SourcePath:分区0-6
*ReadSize:分区的大小
*/
void Copy_BlockFile(char *SourcePath,long ReadSize)
{
char Buffer[512]={};
long int pos1=0,pos2=0;
//记录文件偏移的位置
FILE *fb_block=fopen(SourcePath,"r");
//打开要读取的块设备
if(fb_block == NULL)
{
perror("fopen block:");
}
size=0;//实际写入文件数据的空间
//读文件
while(1)
{
bzero(Buffer,sizeof(Buffer));
//将Buffer数组里面的包括\0在内的元素清0
pos1=ftell(fb_block);
//获取源文件的偏移量
//每次光标固定在固定个字符量的后面
if((fread(Buffer,1,sizeof(Buffer),fb_block))<sizeof(Buffer))
{
//从文件指针指向的文件中读取数据,读取sizeof(Buffer)次,每次读取1个字节存放到Buffer数组里去
//读取的数量没有sizeof(Buffer)次,<小
pos2=ftell(fb_block);
//返回文件指针所指文件中字符开头到结尾的字符量
//这里的开头是,记录的pos1的结尾
//这里定位到读取完最后的字符后面
if(feof(fb_block))//读到文件的末尾
{
//把剩余的文件写文件
//列如:每行保存8个字节,但是去读了27个字节的数据,那么第四行仅保存剩余的3的数据
//所以使用光标第二次所在位 - 第一次所在位 == 实际写入的空间
fwrite(Buffer,1,pos2-pos1,fb_txt);
size+=(pos2-pos1)*1;//统计向这个大小的空间写入了几次数据
break;
}
else if (ferror(fb_block))
{
//返回有关指定文件的最新文件I / O操作的错误消息
perror("fread:");
break;
}
}
//读完了写文件(不看上面,这里是正好读取数组大小的字节)
fwrite(Buffer,1,sizeof(Buffer),fb_txt);
size+=sizeof(Buffer);
}
//读取完文件后把剩余的空间填充0xff
// printf("ReadSize=%d,size=%d\n",ReadSize,size);
if(ReadSize>size)
{
//各分区空间>实际写入的空间
WriteFlash(ReadSize-size,0xff);
}
//关闭文件
fclose(fb_block);
}
/*
*功能:往fb_txt所指向的文件写入num,大小为flashsize个字节
*FlashSize:内存大小如:空余的分区
*num:要写入的数入:0xff
*/
void WriteFlash(long FlashSize,int num)
{
char Buffer[512]={};
//读取完文件后把剩余的空间填充0xff
int i=0,writesize=0;
//填充的次数---判断剩多少空间
int times=FlashSize/sizeof(Buffer);
for(i=0;i<times;i++)
{
memset(Buffer,num,sizeof(Buffer));
fwrite(Buffer,sizeof(num),sizeof(Buffer)/sizeof(num),fb_txt);
writesize+=sizeof(Buffer);
}
memset(Buffer,num,sizeof(Buffer));
printf("FlashSize:%d-size:%d=%d\n",FlashSize,size,FlashSize-size);
if(FlashSize>writesize)
fwrite(Buffer,sizeof(num),FlashSize-writesize,fb_txt);//把最后一次文件写入0xff
}
int main(int argc,char**argv)
{
fb_txt= fopen("ReadBlock.txt","w");
//文件不存在会创建一个
if(fb_txt == NULL)
{
perror("fopen txt:");
}
Copy_BlockFile("/dev/mtdblock0",SIZE_MTDBLOCK0);
//将/dev/mtdblock0路径下SIZE_MTDBLOCK0大小的文件拷贝到ReadBlock.txt文件中
Copy_BlockFile("/dev/mtdblock1",SIZE_MTDBLOCK1);
Copy_BlockFile("/dev/mtdblock2",SIZE_MTDBLOCK2);
Copy_BlockFile("/dev/mtdblock3",SIZE_MTDBLOCK3);
Copy_BlockFile("/dev/mtdblock4",SIZE_MTDBLOCK4);
Copy_BlockFile("/dev/mtdblock5",SIZE_MTDBLOCK5);
Copy_BlockFile("/dev/mtdblock6",SIZE_MTDBLOCK6);
fclose(fb_txt);
return 0;
}
过程图解
- 先把read.c文件放到svnwork可运行目录下
- 然后使用命令:arm-histbv320-linux-gcc read.c -o read得到运行程序文件read
- 把read拷贝到挂载目录下(已经将APP和GUI的release目录下文件拷贝到此处)
- 在挂载目录下./read编程文件
- 得到下列两个文件
- ReadBlock.txt文件无权限,需要 chmod 777 ReadBlock.txt给与查看权限
- 查看,保存的是二进制文件,如此显示是正常的
程序图解