Добавление каталога в tarfile с помощью libarchive

Я пытаюсь добавить каталог в архив tar, который я создаю. Архив создан, однако в нем нет файлов.

Вот код, который я использую с помощью libarchive (каталог — это QString пути к каталогу, который нужно передать).

struct archive *a;
struct archive_entry *entry;
struct stat st;
char buff[8192];
size_t bytes_read;
int fd;

// the path of the output tarfile
QByteArray outArray = (directory + ".tar").toLocal8Bit();
char *outDirectory = outArray.data();

// the path to the input directory
QByteArray inputArray = directory.toLocal8Bit();
char *inputDirectory = inputArray.data();

QFileInfo inputInfo;
inputInfo.setFile(directory);

// the name of the directory
QByteArray pathArray = inputInfo.fileName().toLocal8Bit();
char *pathDirectory = pathArray.data();

a = archive_write_new();
archive_write_add_filter_gzip(a);
archive_write_set_format_pax_restricted(a);
archive_write_open_filename(a, outDirectory);

entry = archive_entry_new();
stat(inputDirectory, &st);

archive_entry_set_pathname(entry, pathDirectory);
archive_entry_set_filetype(entry, AE_IFDIR);
archive_entry_copy_stat(entry, &st);
archive_write_header(a, entry);

fd = open(inputDirectory, O_RDONLY);
bytes_read = read(fd, buff, sizeof(buff));
while (bytes_read > 0) {
archive_write_data(a, buff, bytes_read);
bytes_read = read(fd, buff, sizeof(buff));
}
close(fd);

archive_write_finish_entry(a);
archive_write_close(a);
archive_write_free(a);

0

Решение

Логика вашего кода неверна. Вы пытаетесь прочитать каталог, в то время как вы должны прочитать файлы в каталоге … Вам понадобится что-то вроде этого, чтобы перебрать файл:

QDirIterator it("/etc", QDirIterator::Subdirectories);
while (it.hasNext())
qDebug() << it.next();

Это подтверждение концепции кода, чтобы исправить вашу проблему.

#include <QString>
#include <QByteArray>
#include <QFileInfo>
#include <QDebug>
#include <QDirIterator>

#include <archive.h>
#include <archive_entry.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
QString directory = "/home/lpapp/tmp/stackoverflow/test";
struct archive *a;
struct archive_entry *entry;
struct stat st;
char buff[8192];
size_t bytes_read;
int fd;

QByteArray outArray = directory.toLocal8Bit() + ".tar";
char *outDirectory = outArray.data();
qDebug() << outDirectory;

QByteArray inputArray = directory.toLocal8Bit();
char *inputDirectory = inputArray.data();
qDebug() << inputDirectory;

QFileInfo inputInfo;
inputInfo.setFile(directory);

// the name of the directory
QByteArray pathArray = inputInfo.fileName().toLocal8Bit();
char *pathDirectory = pathArray.data();
qDebug() << pathDirectory;

a = archive_write_new();
archive_write_add_filter_gzip(a);
archive_write_set_format_pax_restricted(a);
archive_write_open_filename(a, outDirectory);

QDirIterator it(directory, QDirIterator::Subdirectories);
while (it.hasNext()) {
entry = archive_entry_new();
stat(inputDirectory, &st);

archive_entry_set_pathname(entry, it.next().toLocal8Bit().constData());
archive_entry_set_filetype(entry, AE_IFDIR);
archive_entry_copy_stat(entry, &st);
archive_write_header(a, entry);

fd = open(inputDirectory, O_RDONLY);
bytes_read = read(fd, buff, sizeof(buff));
while (bytes_read > 0) {
archive_write_data(a, buff, bytes_read);
bytes_read = read(fd, buff, sizeof(buff));
}
close(fd);
archive_entry_free(entry);

archive_write_finish_entry(a);
archive_write_close(a);
archive_write_free(a);
}

return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
LIBS += -larchive
SOURCES += main.cpp

Построить и запустить

qmake && make && ./main
2

Другие решения


По вопросам рекламы [email protected]