#include #include #include #define BS 128 /* Program slouci vice souboru dohromady a zase je umi extrahovat. * Vice info vizte pack.c, tato verze se lisi tim, ze umi sloucit * i soubory s mezerama v nazvu, napr.: * * ./pack2 -s zapack.pack prvni.txt druhy\ s\ mezerou.txt * zapackovavame... prvni.txt * zapackovavame... druhy s mezerou.txt * * ./pack2 -r zapack.pack * depackovavame... prvni.txt * depackovavame... druhy s mezerou.txt */ int main(int argc, char**argv) { if (argc < 3) { // osetreni spatneho spusteni bez parametru fprintf(stderr, "Chyba!... navodek na pouziti!\n"); return 1; } char buf[BS]; if (!strcmp(argv[1], "-s")) { // sbal FILE *fout = fopen(argv[2], "wb"); for (int i = 3; i < argc; ++i) { printf("zapackovavame... %s\n", argv[i]); FILE *fin = fopen(argv[i], "rb"); fseek(fin, 0, SEEK_END); fprintf(fout, "%ld ", strlen(argv[i])); fputs(argv[i], fout); fprintf(fout, "%ld ", ftell(fin)); rewind(fin); size_t precteno; do { precteno = fread(buf, 1, BS, fin); fwrite(buf, 1, precteno, fout); } while (precteno == BS); fclose(fin); } fclose(fout); } else if (!strcmp(argv[1], "-r")) { // rozbal FILE *fin = fopen(argv[2], "rb"); char fnazev[257]; long int fdelka; int delka_jmena; while (1 == fscanf(fin, "%d%*c", &delka_jmena) && NULL != fgets(fnazev, delka_jmena+1, fin) // fgets cte o 1 mene && 1 == fscanf(fin, "%ld%*c", &fdelka) && strlen(fnazev) > 0 ) { printf("depackovavame... %s\n", fnazev); FILE *fout = fopen(fnazev, "wb"); size_t precteno; do { precteno = fread(buf, 1, fdelka > BS ? BS : fdelka, fin); fwrite(buf, 1, precteno, fout); fdelka -= BS; } while (fdelka > 0); fclose(fout); } fclose(fin); } else { fprintf(stderr, "Chybny prepinac: %s\n", argv[1]); return 2; } return 0; }