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