Chinaunix首页 | 论坛 | 博客
  • 博客访问: 461183
  • 博文数量: 293
  • 博客积分: 4204
  • 博客等级: 上校
  • 技术积分: 3060
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-21 10:27
个人简介

nobody

文章分类

全部博文(293)

文章存档

2014年(27)

2013年(105)

2012年(41)

2011年(109)

2010年(11)

分类:

2010-09-19 21:03:04

截取文件的一部分数据,原本在系统上用很简单的就可以实现
dd  if=input_file  of=out_file  bs=xx  skip=xxx (截取文件头部到数据)。
但由于系统的内存很小,而且根文件系统在内存里面,所以这种方式占用了
大概两倍文件大小到内存,升级进程有时候会阻塞掉。
想到的一个办法就是在文件内部实现数据的截取,大概的流程为;
#define DROP_ERROR (-1)
#define DROP_OK (0)
#define BUF_LEN (0X20000UL)
int drop_file_head_data(const char *const file_name,int const drop_len)
{
int src_fd = 0;
int dest_fd = 0;
char * buffer = NULL;
struct stat sb;

int ret = DROP_ERROR;
if((0==len)||
(0!=stat(file_name,&sb))||
(!S_ISREG(sb.st_mode))||
(len>=sb.st_len)||
(src_fd=open(file_name,O_RDONLY)<0)||
(dest_fd=open(file_name,O_WRONLY)<0)||
(NULL==(buffer = malloc(BUF_LEN)))||
(-1==lseek(src_fd,drop_len,SEEK_SET)))/*设置src_fd的file pointer*/
   goto out;
/*余下的就是read from src_fd and write to dest_fd*/
while(1)
{
read(src_fd,buffer, ret);
write(dest_fd,buffer,ret);
if(xxx)
break;
}

if(ftruncate(dest_fd,sb.st_size-drop)<0) /*设置文件长度*/
goto out;
ret = DROP_OK;
out:
if(NULL!=buffer)
free(buffer);
return ret;
}
阅读(1285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~