分割合并文件

/**************************************************
 *使用格式:
 *命令名 f/h 文件名(去掉前面的序号[01])
 *(只能把文件分割成5部分)
 *design by zcm
 *************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>




int main(int argc, char **argv)
{
int old_fd;//分割时用
int new_fd;//合并时用
int numbers = 5;//分割个数
int fd[numbers];//每个新文件描述符
int r;//成功标注
int i;
int len;
char filename[128];
char *buffer = NULL;
char h_buffer[4096];
struct stat fsta;//存储文件信息
if(argc != 3)
{
printf("使用格式错误\n");
return 1;
}
if(argv[1][0] == 'f')//分割文件
{
r = stat(argv[2], &fsta);
if(r == -1)
{
printf("stat错误\n");
return 2;
}
if(!S_ISREG(fsta.st_mode))
{
printf("不是普通文件\n");
return 3;
}
old_fd = open(argv[2], O_RDONLY);
len = fsta.st_size/5;//前4部分文件大小
buffer = (char *)malloc(len);
for(i = 0; i < 4; i++)
{
int read_size = 0;
sprintf(filename, "0%d%s\0", i+1, argv[2]);
fd[i] = open(filename, O_WRONLY|O_CREAT, 0666);
while(read_size <= len)
{
r = read(old_fd, buffer, sizeof(buffer));
if(r == 0)
{
printf("分割结束\n");
break;
}
write(fd[i], buffer, r);
read_size += r;
}
}
sprintf(filename, "0%d%s\0", 5, argv[2]);
fd[5] = open(filename, O_WRONLY|O_CREAT, 0666);
while((r = read(old_fd, buffer, sizeof(buffer))) != 0)
{
write(fd[5], buffer, r);
}
free(buffer);
}
if(argv[1][0] == 'h')//合并文件
{
sprintf(filename, "new%s\0", argv[2]);
new_fd = open(filename, O_WRONLY|O_CREAT, 0666);
  for(i = 0; i < 5; i++)
    {
sprintf(filename, "0%d%s\0", i+1, argv[2]);
fd[i] = open(filename, O_RDONLY);
while((r = read(fd[i], h_buffer, sizeof(h_buffer))) != 0)
{
           write(new_fd, h_buffer, r);
      }
    }


}


return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值