Сжатие или частичное усечение файла в DOS/FAT

Мне поручили написать программу сбора данных для Unitech. HT630, который работает под управлением проприетарной операционной системы DOS и может запускать исполняемые файлы, скомпилированные для 16-разрядной версии MS DOS, с некоторыми ограничениями. Я использую компилятор Digital Mars C/C++, который до сих пор работает хорошо.

Одним из требований приложения является то, что файл данных должен быть удобочитаемым текстом, то есть файл можно импортировать в Excel или открыть в Блокноте. Я использую формат записи переменной длины, очень похожий на CSV, который я успешно реализовал с помощью функций ввода-вывода файлов стандартной библиотеки C.

При сохранении записи я должен вычислить, больше или меньше обновленная запись, чем версия записи, которая в данный момент находится в файле данных. Если больше, я сначала сдвигаю все записи сразу после текущей записи вперед на разницу в размерах, рассчитанную перед сохранением обновленной записи. EOF автоматически расширяется ОС для размещения дополнительных данных. Если меньше, я сдвигаю все записи назад на рассчитанное мной смещение. Это работает хорошо, однако я не нашел способа изменить маркер EOF или размер файла, чтобы игнорировать данные после окончания последней записи.

Большую часть времени записи будут увеличиваться в размере, потому что программа сбора данных будет заполнять некоторые пустые поля данными при сохранении записи. Записи будут уменьшаться в размере только при исправлении существующей записи или при обычном сохранении записи, если описательные данные в записи длиннее, чем то, что программа считывает в памяти.

В случае сокращения записи после последней записи в файле у меня остаются все данные, которые были там до сдвига. Я пишу разделитель EOF в файл после «сохранения записи с сокращением», чтобы сигнализировать, где конец моих записей, и заполняю оставшиеся данные, но тогда у меня больше нет чистого файла до «растущей записи». расширяет размер файла поверх заполненной области. Функция truncate() в unistd.h не работает (теперь я думаю, что это только для *nix-вариантов?).

Одно из предложенных решений, которое я видел, включает создание второго файла и запись всех данных, которые вы хотите сохранить, в этот файл, а затем удаление оригинала. Поскольку у меня есть только 4 МБ дискового пространства для использования, это работает, если размер файла меньше 2 МБ минус размер исполняемого файла моей программы и файлов конфигурации, но в противном случае это не удастся. Весьма вероятно, что когда это будет запущено в производство, пользователи получат файл размером более 2 МБ.

Я просмотрел список прерываний Ральфа Брауна и ссылку на прерывание в Язык ассемблера IBM PC и программирование, и я не могу найти ничего, обновить размер файла или подобное.

Возможно ли уменьшение размера файла без создания второго файла в DOS?


person Community    schedule 19.05.2010    source источник
comment
Живет ли FAT FS на Flash? Это может не быть проблемой (в зависимости от использования), но дефрагментация файла таким образом не будет хорошо работать с ограниченным сроком стирания/записи флэш-памяти.   -  person nategoose    schedule 20.05.2010
comment
@nategoose - Устройство имеет раздел RAM-диска и раздел флэш-памяти на 256 КБ, в данный момент я строго работаю с RAM-диском. Раздел флэш-памяти используется только для хранения программ, а не данных.   -  person    schedule 20.05.2010
comment
Некоторые операционные системы, включая DOS, могут дополнять файл до ближайшего эффективного размера сектора. Файлы, начинающиеся на четной границе сектора, легче и быстрее получить, чем те, которые не совпадают.   -  person Thomas Matthews    schedule 20.05.2010


Ответы (2)


Чтобы уменьшить размер файла в DOS, вы ищете точку усечения с помощью int 21 (ax=4200h, bx=handle, cx:dx=offset) и вызываете запись с нулевой длиной: int 21 (ax=4000h, bx=handle, cx=0 (что означает усечение))

person Sedat Kapanoglu    schedule 19.05.2010

В качестве альтернативы смещению записей при изменении размера записи вы можете закончить каждую запись полем «заполнения», которое дополняет ее до стандартного размера (например, с пробелами или подобным).

person caf    schedule 19.05.2010