2014-09-19 2 views
0

Я пытаюсь переименовать записи архива, используя библиотеку libarchive. В частности, я использую функцию archive_entry_set_pathname.Переименуйте непустой каталог в архив с помощью libarchive

Файлов и пустые каталоги правильно переименовали, но, к сожалению, это не работает, если каталог не пуст: вместо того, чтобы быть переименованы, новый пустого каталога с новым именем создаются как собрат целевого каталога, который имеет старое имя.

Соответствующий фрагмент кода:

... 
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 
     } 
    } 

Что с непустых каталогов?

ответ

1

В архиве файлы хранятся с указанием их полного пути относительно корня архива. Ваш код соответствует только записи в каталоге, вам также нужно сопоставить все записи ниже этого каталога и переименовать их. Я не эксперт 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 
    } 
}    
Смежные вопросы