分割合并文件

本文介绍了一个简单的命令行工具,该工具可以将一个大文件分割为多个小文件或将多个小文件合并回原始的大文件。分割时最多可分成五个部分,且支持通过命令行参数指定操作类型(分割或合并)。此工具利用了标准C库和一些UNIX特有的库函数实现。
摘要由CSDN通过智能技术生成
/**************************************************
 *使用格式:
 *命令名 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、付费专栏及课程。

余额充值