root / split.c @ 132932cd7f245a2592cf4c99d1a64a50febadf01
Historique | Voir | Annoter | Télécharger (1,88 ko)
| 1 | /*
|
|---|---|
| 2 | * Copyright (c) 2005 by Romuald DELAVERGNE |
| 3 | * It can be redistributed under the terms of the GNU General Public License. |
| 4 | */ |
| 5 | #include <stdlib.h> |
| 6 | #include <stdio.h> |
| 7 | #include <string.h> |
| 8 | #include <sys/stat.h> |
| 9 | #include <io.h> |
| 10 | |
| 11 | void
|
| 12 | exitOnError(char *msg) {
|
| 13 | perror(msg); |
| 14 | exit(1);
|
| 15 | } |
| 16 | |
| 17 | int
|
| 18 | main(int argc, char *argv[]) { |
| 19 | void *buf;
|
| 20 | struct stat statFileIn;
|
| 21 | FILE *fileIn, *fileOut; |
| 22 | char
|
| 23 | fileName[255],
|
| 24 | *prog = argv[0],
|
| 25 | *prefix = argv[3];
|
| 26 | unsigned long |
| 27 | nbFiles, lastSize, maxSize, size, nb, nbWrited, nbRest; |
| 28 | int i;
|
| 29 | |
| 30 | buf = malloc(BUFSIZ); |
| 31 | |
| 32 | if (argc < 4) { |
| 33 | printf("%s: too few parameters !\n", prog);
|
| 34 | printf("split a file into pieces\n");
|
| 35 | printf("usage: %s FILE SIZE PREFIX\n", prog);
|
| 36 | printf(" FILE : big file to split\n");
|
| 37 | printf(" SIZE : size in bytes\n");
|
| 38 | printf(" PREFIX: result files without suffix\n");
|
| 39 | exit(0);
|
| 40 | } |
| 41 | |
| 42 | if ((fileIn = fopen(argv[1], "rb")) == NULL) exitOnError(argv[1]); |
| 43 | if (fstat(fileIn->fd, &statFileIn) == -1) exitOnError(argv[1]); |
| 44 | if (sscanf(argv[2], "%lu", &maxSize) == 0) { |
| 45 | fprintf(stderr, "%s: invalid size !\n", argv[2]); |
| 46 | exit(1);
|
| 47 | } |
| 48 | nbFiles = statFileIn.st_size/maxSize; |
| 49 | lastSize = statFileIn.st_size%maxSize; |
| 50 | if (lastSize > 0) nbFiles++; else lastSize = maxSize; |
| 51 | i = 0;
|
| 52 | while (i < nbFiles) {
|
| 53 | i++; |
| 54 | size = (i == nbFiles) ? lastSize: maxSize; |
| 55 | sprintf(fileName, "%s.%03d", prefix, i);
|
| 56 | if (access(fileName, 0) == 0) { |
| 57 | fprintf(stderr, "%s: file already exists !\n", fileName);
|
| 58 | exit(1);
|
| 59 | } |
| 60 | if ((fileOut = fopen(fileName, "wb")) == NULL) exitOnError(fileName); |
| 61 | nbWrited = 0;
|
| 62 | while (nbWrited < size) {
|
| 63 | nbRest = size - nbWrited; |
| 64 | nb = (nbRest < BUFSIZ) ? nbRest: BUFSIZ; |
| 65 | if (fread(buf, nb, 1, fileIn) != 1) exitOnError(prog); |
| 66 | if (fwrite(buf, nb, 1, fileOut) != 1) exitOnError(prog); |
| 67 | nbWrited += nb; |
| 68 | } |
| 69 | fclose(fileOut); |
| 70 | } |
| 71 | fclose(fileIn); |
| 72 | |
| 73 | return 0; |
| 74 | } |