У меня есть программа на C ++, и я хочу прочитать архив с описанием с диска. Я хочу перестроить его в примерно древовидную форму, чтобы отразить структуру на диске (такие штуки, как символические ссылки / жесткие ссылки, не поддерживаются).
При чтении следующего заголовка ясно, что вы можете проверить тип записи, чтобы увидеть, является ли он каталогом или файлом. Что не ясно, так это то, что происходит дальше, если это каталог. Есть ли archive_read_next_header
автоматически выполнить полный обход дерева в режиме BFS / DFS? Или я должен рекурсивно создавать новые archive_entry
структуры и вызов какой-то функции, которую я еще не нашел, чтобы пройти записи каталога?
Вообще говоря, архивные файлы представляют собой плоскую последовательность записей файлов и каталогов. Форматы архива обычно не указывают требуемый порядок. Некоторые форматы архивов неявно требуют наличия записей каталога, но некоторые вообще не требуют их. В первом случае неявное требование исходит от архивных утилит, которые будут выдавать жалобы при извлечении файла, если каталог, в котором должен находиться файл, не существует. Это означает, что либо для этой директории должна быть запись где-то ранее в архиве, чтобы ее создать, либо она должна существовать до запуска утилиты. Другие архивные утилиты, такие как tar
или же zip
, просто создаст недостающие каталоги.
Другими словами, записи каталога представляют только сам каталог, а не его содержимое. В общем случае вы должны быть готовы к созданию узлов каталогов в вашем дереве по мере их обнаружения в именах файлов и записей каталогов. Вам нужно будет пройтись по дереву, чтобы найти узел, к которому должен быть присоединен каждый файл.