/* РАЗДЕЛЕНИЕ ФАЙЛОВ ДЛЯ ЭЛЕКТРОННОЙ ПОЧТЫ E-MAIL */ #include /* Рюмик С.М., "РЛ.ВК", 2001 г */ #include /* Turbo C-2.0, модель памяти Small */ main() { FILE *f1, *f2; /* Указатели на файлы ввода-вывода */ int ch; /* Вводимый символ */ static char n1[12], n2[12]; /* Имена файлов */ unsigned long simb = 0L; /* Длина исходного файла */ unsigned long bt = 0L; /* Длина частей файла */ unsigned block = 0, i = 0, z = 0, j = 0; puts ("Введите цифру:\n<1> - разделить файл на блоки"); puts ("<2> - восстановить файл из блоков"); /* Меню */ while ((ch = getch()) < 49 || ch > 50); /* Опрос */ if (ch == 49) /* Нажатие клавиши <1> */ { printf ("Введите полное имя файла, подлежащего "); printf ("разделению: "); scanf ("%s", n1); /* Ввод имени исходного файла */ if ((f1 = fopen (n1,"rb")) == NULL) ex(n1); while ((n1 [i] != 46) && (i < strlen (n1))) i++; if (i > 8) i = 8; /* Местоположение точки в имени */ strcpy (n2, n1); /* Копирование имени файла */ n2[i] = 46; n2[i+1]=n2[i+2]=n2[i+3]=48; /* .000 */ if (strcmp (n1, n2) == NULL) /* Проверка имени */ { puts ("Файл не должен иметь расширение .000"); exit (1); /* Выход из программы */ } if ((f2 = fopen (n2, "rb")) != NULL) { printf ("Будет создан файл %s, но он уже",n2); puts (" существует!\nПродолжить (Y/N)?"); while ((ch = getch()) == 78 || ch == 110) exit(1); } while ((ch = getc (f1)) != EOF) simb++; /* Длина */ if (simb < 2) /* Проверка длины файла */ { puts ("Ошибка! Длина файла меньше 2 байтов."); exit (1); } while ((bt < ((simb-1)/10+1)) || (bt > (simb-1))) { printf ("Файл %s содержит %lu байтов\n",n1,simb); printf ("Введите длину одного блока в байтах ("); printf ("%lu ... %lu): ", (simb-1)/10+1, simb-1); scanf ("%lu", &bt); /* Ввод длины блока */ block = (simb-1)/bt+1; /* Количество блоков */ } printf ("Файл %s будет разделен на ",n1); printf ("%u блоков. Начать? (Y/N)",block); while ((ch = getch())== 78 || ch == 110) /* Кл. */ { puts ("\nРабота остановлена."); exit (1); /* Выход без разделения файла */ } fseek (f1, 0L, 0); /* Возврат к началу файла */ for (j = 0; j < block; j++) /* Поблочный цикл */ { n2[i+3] = j+48; /* Третья цифра расширения */ if ((f2 = fopen (n2, "wb")) == NULL) ex(n2); if (j == 0) /* Запись хэдера в файле .000 */ { for (z = 0; z < 12; z++) putc (n1 [z], f2); putc (block, f2); /* Количество блоков */ } for (z = 0; z < bt; z++) /*Запись одного блока */ { if ((ch = getc (f1)) != EOF) putc (ch, f2); } fclose (f2); /* Закрытие частей файла */ } fclose (f1); /* Закрытие исходного файла */ printf ("\nФайл %s успешно разделен!",n1); } else /* Нажатие клавиши <2> */ { printf ("Введите полное имя восстанавливаемого"); printf (" файла с расширением .000: "); scanf ("%s", n2); /* Ввод имени головного файла */ if ((f2 = fopen (n2, "rb")) == NULL) ex(n2); for (z = 0; z < 12; z++) n1 [z] = getc (f2); block = getc (f2); /* Чтение хэдера */ if ((f1 = fopen (n1, "wb")) == NULL) ex(n1); fclose (f1); /* Обнуление исходного файла */ for (j = 0; j < block; j++) /* Поблочный цикл */ { n2 [strlen(n2)-1] = j+48; /*Смена расширений */ if (j != 0) { if ((f2 = fopen (n2, "rb")) == NULL) ex(n2); } if ((f1 = fopen (n1, "ab")) == NULL) ex(n1); while ((ch = getc (f2)) != EOF) putc (ch, f1); fclose (f2); /* Закрытие частей файла */ fclose (f1); /* Закрытие исходного файла */ } printf ("Файл %s успешно восстановлен!\n",n1); } } /* Функция аварийного выхода из программы */ ex(char *p) /* Вход: p - имя файла */ { printf ("Невозможно открыть файл %.12s !",p); exit (1); /* Аварийный выход из программы */ }