Пропоную вашій увазі програму, за допомогою якої можна розрізати заданий файл на частини зазначеної довжини, або отримати частину файлу зазначеної довжини, починаючи з зазначеного зсуву, або пропустити перші X байтів файлу, а залишок розрізати на частини розміром Y байтів, або розділити файл на частини в X, Y, Z байтів і залишок # 133; Як ви побачите далі, програма дозволяє розрізати файл на частини і більш складним чином.
(Зауважу, що насправді «розрізання» # 151; не зовсім точний термін, так як програма не змінює вихідний файл, а створює нові файли # 151; частини вихідного.)
При запуску програми треба вказати в командному рядку ім'я вихідного файлу, ім'я одержуваних файлів (без розширення # 151; воно буде сформовано автоматично) і команди, що визначають, як саме файл буде розбитий на частини.
Вихідний файл передбачається знаходяться в поточному каталозі, там же будуть сформовані і вихідні файли. Розширення першого сформованого файлу буде «001», другого # 151; «002», і так далі (якщо вийде більш як 999 частин, будуть записані тільки перші 999).
Тепер про командах, що визначають, як саме файл буде розбитий на частини. Може бути вказана одна або кілька команд; якщо їх декілька, вони розділяються комами. Всього можна використовувати чотири різних типи команд:
записати частину довжиною n байтів, починаючи з поточної позиції в вихідному файлі (якщо до кінця вихідного файлу залишилося менше n байтів, розмір записаної частини дорівнюватиме решти файлу);
пропустити n байтів з поточної позиції в вихідному файлі (якщо до кінця вихідного файлу залишилося менше n байтів, будуть пропущені всі залишилися байти);
записувати частини довжиною n байтів, починаючи з поточної позиції в вихідному файлі, поки не буде досягнутий кінець файлу (таким чином, довжина останньої записаної частини може виявитися менше n);
записати частина, починаючи з поточної позиції в вихідному файлі та до кінця файлу. Ця команда, очевидно, може бути тільки останньою.
У всіх командах n # 151; число від 1 до 0x7FFFFFFF (2147483647), записане в десятковому або в шістнадцятковому вигляді (при записі в шістнадцятковому вигляді число повинне передувати символами «0x», регістр символів у записі числа не має значення).
Програма може обробити не більше 64 команд (визначається значенням константи MAX_COMM в початковому тексті програми), але стільки команд ви все одно не введете через обмеження на довжину командного рядка в DOS.
Команди виконуються в порядку їх запису. Перед виконанням першої команди поточна позиція в вихідному файлі # 151; це початок файлу. Робота програми закінчується, якщо всі команди виконані, або якщо досягнуто кінець вихідного файлу, або якщо вже записано 999 частин файлу, або якщо сталася якась помилка при роботі з файлами.
Всього лише чотири типи команд дають можливість досить різноманітною обробки файлів. Нижче наведено кілька прикладів.
- Отримати перші 500 байтів файлу.
- Навпаки, пропустити перші 500 байтів і отримати залишок файлу.
- Отримати частину файлу, що починається зі зсуву 0x1000 від початку і довжиною 0x300 байтів.
- Розбити файл на чотири частини: 100, 200, 300 байтів і залишок.
- Розбити файл на частини по 10000 байтів (крім, може бути, останній частині).
- Пропустити 0x400 байтів файлу, записати частину довжиною 123 байта, потім пропустити ще 0x100 байтів і записати залишок.
Також зауважу, що не дуже складно доопрацювати програму, додавши ще якісь типи команд.
Звертаю увагу, що отримується файл не повинен збігатися з будь-яким з вихідних файлів, інакше вміст цього вихідного файлу може бути втрачено, і виконання команди завершиться з помилкою!
Описана в цій статті програма не може обробляти файли, довжина яких більше або дорівнює 2 ГБ (2147483648 байт). Справа в тому, що використовувана в програмі бібліотечна функція для визначення довжини файлу (filelength) повертає результат типу long, а максимальне позитивне значення цього типу в Turbo C 2.0 одно 0x7FFFFFFF (2147483647), тобто 2 ГБ # 150; 1. Також значення типу long вимагає в якості вхідного параметра функція fseek, використовувана в програмі для переходу до потрібної позиції в оброблюваному файлі.