Я пытаюсь переименовать записи архива, используя libarchive
библиотека.
В частности я использую функцию archive_entry_set_pathname
,
Файлы и пустые каталоги правильно переименовываются, но, к сожалению, это не работает, если каталог не пустой: вместо того, чтобы переименовывать, новый пустой Папка с новым именем создается как одноуровневая папка целевого каталога, который имеет старое имя.
Соответствующий фрагмент кода:
...
while (archive_read_next_header(inputArchive, &entry) == ARCHIVE_OK) {
if (file == QFile::decodeName(archive_entry_pathname(entry))) {
// FIXME: not working with non-empty directories
archive_entry_set_pathname(entry, QFile::encodeName(newPath));
}
int header_response;
if ((header_response = archive_write_header(outputArchive, entry)) == ARCHIVE_OK) {
... // write the (new) outputArchive on disk
}
}
Что не так с непустыми каталогами?
В архиве файлы хранятся со своими полными путями относительно корня архива. Ваш код соответствует только записи каталога, вам также необходимо сопоставить все записи ниже этого каталога и переименовать их. Я не эксперт по Qt, и я не пробовал этот код, но вы поймете идею.
QStringLiteral oldPath("foo/");
QStringLiteral newPath("bar/");
while (archive_read_next_header(inputArchive, &entry) == ARCHIVE_OK) {
QString arEntryPath = QFile::decodeName(archive_entry_pathname(entry));
if(arEntryPath.startsWith(oldPath) {
arEntryPath.replace(0, oldPath.length(), newPath);
archive_entry_set_pathname(entry, QFile::encodeName(arEntryPath));
}
int header_response;
if ((header_response = archive_write_header(outputArchive, entry)) == ARCHIVE_OK) {
... // write the (new) outputArchive on disk
}
}