/************************************************** *使用格式: *命令名 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; }