Выполнение в потоковом режиме, например, tar, возможно, самая простая реализация. Сначала напишите магическое число, чтобы вы могли определить, что это ваш формат архива. Затем я бы предложил использовать stat (2) (это man-синтаксис для man-страницы stat, раздел 2), чтобы получить размер файла, подлежащего архивированию. На самом деле, посмотрите внимательно на доступные вам поля статистики, там может быть какая-то интересная информация, которую вы хотели бы сохранить.
Запишите необходимую информацию в виде тега = значение, по одному на строку. Например:
FileName=file1.txt
FileSize=10
FileDir=./blah/blah
FilePerms=0700
Завершите заголовок двумя символами новой строки, чтобы вы знали, когда начинать выталкивать байты FileSize на диск. Вам не нужен маркер заголовка начала, потому что вы знаете размер файла для записи и знаете, когда начинать синтаксический анализ заголовка снова.
Я предлагаю вам использовать текстовый формат для информации заголовка, потому что тогда вам не нужно беспокоиться о порядке следования байтов и т. Д., О чем вам следует беспокоиться, если вы записываете сырую двоичную структуру на диск.
При чтении вашего архива анализируйте строки заголовка одну за другой и заполняйте локальную структуру для хранения этой информации. Затем запишите файл на диск и установите все свойства файла, которые необходимо обновить, на основе извлеченной вами информации заголовка.
Надеюсь, это поможет. Удачи.