Как можно распаковать\получить инфу о файлах архива в c++?

Пользователь

от lamar , в категории: C/C++ , 8 месяцев назад

Как можно распаковать\получить инфу о файлах архива в c++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от wilburn , 8 месяцев назад

@lamar 

Для распаковки архивов в C++ можно использовать библиотеку zlib. Она содержит функции для сжатия и распаковки данных в формате gzip, а также для работы с другими форматами архивов.


Чтобы получить информацию о файлах в архиве без распаковки, можно использовать библиотеку libarchive. Эта библиотека поддерживает множество форматов архивов, таких как tar, ZIP, 7-Zip и другие, и позволяет извлекать информацию о содержимом архивов без их распаковки.


Для работы с библиотекой zlib можно использовать следующий код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include 
#include 
#include 

void uncompress_file(const std::string& compressed_filename, const std::string& uncompressed_filename) {
    std::ifstream compressed_file(compressed_filename, std::ios::binary);
    std::ofstream uncompressed_file(uncompressed_filename, std::ios::binary);

    // Получаем размер сжатого файла
    compressed_file.seekg(0, std::ios::end);
    size_t compressed_size = compressed_file.tellg();
    compressed_file.seekg(0, std::ios::beg);

    // Выделяем память для буфера сжатых данных
    char* compressed_data = new char[compressed_size];

    // Читаем данные из файла
    compressed_file.read(compressed_data, compressed_size);

    // Выделяем память для буфера распакованных данных
    char* uncompressed_data = new char[uncompressed_size];

    // Создаем структуру для хранения параметров распаковки
    z_stream zstream;
    zstream.zalloc = Z_NULL;
    zstream.zfree = Z_NULL;
    zstream.opaque = Z_NULL;
    zstream.avail_in = compressed_size;
    zstream.next_in = (Bytef*)compressed_data;
    zstream.avail_out = uncompressed_size;
    zstream.next_out = (Bytef*)uncompressed_data;

    // Инициализируем библиотеку zlib для распаковки данных
    inflateInit(&zstream);

    // Распаковываем данные
    int result = inflate(&zstream, Z_FINISH);

    if (result == Z_STREAM_END) {
        // Записываем распакованные данные в файл
        uncompressed_file.write(uncompressed_data, uncompressed_size);
    } else {
        std::cerr << "Error decompressing file
";
    }

    // Освобождаем ресурсы
    inflateEnd(&zstream);
    delete[] compressed_data;
    delete[] uncompressed_data;
}

int main() {
    uncompress_file("compressed_file.gz", "uncompressed_file");
    return 0;
}


Для работы с библиотекой libarchive можно использовать следующий код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include 
#include 
#include 

void print_archive_contents(const std::string& archive_filename) {
    struct archive* archive;
    struct archive_entry* entry;
    int result;

    // Открываем архив для чтения
    archive = archive_read_new();
    archive_read_support_format_all(archive);
    result = archive_read_open_filename(archive, archive_filename.c_str(), 10240);

    if (result == ARCHIVE_OK) {
        // Читаем содержимое архива
        while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
            std::cout << archive_entry_pathname(entry) << std::endl;
        }
    } else {
        std::cerr << "Error opening archive
";
    }

    // Закрываем архив
    archive_read_close(archive);
    archive_read_free(archive);
}

int main() {
    print_archive_contents("archive.tar");
    return 0;
}