Поддерживаемые функции • Начало работы • Скачать • Требования • Строительство и использование • Пожертвовать • Лицензия
Bit7Z -это кроссплатформенная статическая библиотека C ++, которая позволяет сжатие/извлечение архивных файлов через чистый и простой интерфейс обертки к динамическим библиотекам из 7-zip-проекта.
Он поддерживает сжатие и извлечение в и из файловой системы или в память, чтение метаданных архивов, обновления существующих, создание многотомных архивов, обратных вызовов операции и многих других функций.
Присутствие или нет некоторых из вышеперечисленных функций зависит от конкретной общей библиотеки, используемой вместе с Bit7Z.
Например, 7z.dll должен поддерживать все эти функции, 7za.dll должен работать только с форматом файла 7Z, а 7zxa.dll может извлекать только файлы 7z. Для получения дополнительной информации о 7-Zip DLL, пожалуйста, проверьте эту страницу вики.
В конце концов, некоторые другие функции (например, автоматическое обнаружение формата и селективное извлечение с использованием регулярных выражений ) отключены по умолчанию, и макро -определения должны использоваться во время компиляции, чтобы они были доступны (Wiki).
Ниже приведены несколько примеров, которые показывают, как использовать некоторые из основных особенностей Bit7Z.
# include < bit7z/bitfileextractor.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7za.dll " };
BitFileExtractor extractor{ lib, BitFormat::SevenZip };
// Extracting a simple archive
extractor. extract ( " path/to/archive.7z " , " out/dir/ " );
// Extracting a specific file inside an archive
extractor. extractMatching ( " path/to/archive.7z " , " file.pdf " , " out/dir/ " );
// Extracting the first file of an archive to a buffer
std::vector< byte_t > buffer;
extractor. extract ( " path/to/archive.7z " , buffer );
// Extracting an encrypted archive
extractor. setPassword ( " password " );
extractor. extract ( " path/to/another/archive.7z " , " out/dir/ " );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }В качестве альтернативы, если вам нужно работать только над одним архивом:
# include < bit7z/bitarchivereader.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7z.dll " };
// Opening the archive
BitArchiveReader archive{ lib, " path/to/archive.gz " , BitFormat::GZip };
// Testing the archive
archive. test ();
// Extracting the archive
archive. extractTo ( " out/dir/ " );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }# include < bit7z/bitfilecompressor.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7z.dll " };
BitFileCompressor compressor{ lib, BitFormat::Zip };
std::vector< std::string > files = { " path/to/file1.jpg " , " path/to/file2.pdf " };
// Creating a simple zip archive
compressor. compress ( files, " output_archive.zip " );
// Creating a zip archive with a custom directory structure
std::map< std::string, std::string > files_map = {
{ " path/to/file1.jpg " , " alias/path/file1.jpg " },
{ " path/to/file2.pdf " , " alias/path/file2.pdf " }
};
compressor. compress ( files_map, " output_archive2.zip " );
// Compressing a directory
compressor. compressDirectory ( " dir/path/ " , " dir_archive.zip " );
// Creating an encrypted zip archive of two files
compressor. setPassword ( " password " );
compressor. compressFiles ( files, " protected_archive.zip " );
// Updating an existing zip archive
compressor. setUpdateMode ( UpdateMode::Append );
compressor. compressFiles ( files, " existing_archive.zip " );
// Compressing a single file into a buffer
std::vector< bit7z:: byte_t > buffer;
BitFileCompressor compressor2{ lib, BitFormat::BZip2 };
compressor2. compressFile ( files[ 0 ], buffer );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }В качестве альтернативы, если вам нужно работать только над одним архивом:
# include < bit7z/bitarchivewriter.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7z.dll " };
BitArchiveWriter archive{ lib, BitFormat::SevenZip };
// Adding the items to be compressed (no compression is performed here)
archive. addFile ( " path/to/file.txt " );
archive. addDirectory ( " path/to/dir/ " );
// Compressing the added items to the output archive
archive. compressTo ( " output.7z " );
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }# include < bit7z/bitarchivereader.hpp >
try { // bit7z classes can throw BitException objects
using namespace bit7z ;
Bit7zLibrary lib{ " 7za.dll " };
BitArchiveReader arc{ lib, " archive.7z " , BitFormat::SevenZip };
// Printing archive metadata
std::cout << " Archive properties n " ;
std::cout << " Items count: " << arc. itemsCount () << ' n ' ;
std::cout << " Folders count: " << arc. foldersCount () << ' n ' ;
std::cout << " Files count: " << arc. filesCount () << ' n ' ;
std::cout << " Size: " << arc. size () << ' n ' ;
std::cout << " Packed size: " << arc. packSize () << " nn " ;
// Printing the metadata of the archived items
std::cout << " Archived items " ;
for ( const auto & item : arc ) {
std::cout << ' n ' ;
std::cout << " Item index: " << item. index () << ' n ' ;
std::cout << " Name: " << item. name () << ' n ' ;
std::cout << " Extension: " << item. extension () << ' n ' ;
std::cout << " Path: " << item. path () << ' n ' ;
std::cout << " IsDir: " << item. isDir () << ' n ' ;
std::cout << " Size: " << item. size () << ' n ' ;
std::cout << " Packed size: " << item. packSize () << ' n ' ;
std::cout << " CRC: " << std::hex << item. crc () << std::dec << ' n ' ;
}
std::cout. flush ();
} catch ( const bit7z::BitException& ex ) { /* Do something with ex.what()... */ }Полная ссылка на API доступна в разделе Wiki.
Новейший Bit7Z V4 ввел некоторые значительные прерывистые изменения в API библиотеки.
std::string (вместо std::wstring ), поэтому пользователи могут легче использовать библиотеку в кроссплатформенных проектах (V4 также представил поддержку Linux/macOS).std::string s будет рассматриваться как кодированный UTF-8.-DBIT7Z_USE_NATIVE_STRING cmake.BitExtractor теперь называется BitFileExtractor .BitExtractor - это просто название класса шаблонов для всех классов извлечения.BitCompressor теперь называется BitFileCompressor .BitCompressor - это просто название класса шаблонов для всех классов сжатия.ProgressCallback теперь должен вернуть значение bool указывающее, может ли текущая операция продолжаться ( true ) или нет ( false ).include/ в папку include/bit7z/ , поэтому директивы #include теперь должны быть подготовлены bit7z/ к включенному имени заголовка (например, #include <bit7z/bitfileextractor.hpp> ).lib/<architecture>/ ; Если генератор CMAKE состоит из нескольких конфигурации (например, генераторы Visual Studio), выходной папкой по умолчанию является lib/<architecture>/<build type>/ .BIT7Z_VS_LIBNAME_OUTDIR_STYLE cmake.Каждый выпущенный пакет содержит:
Пакеты доступны как для архитектур X86 , так и для X64 .
Вы также можете клонировать/загрузить этот репозиторий и создать библиотеку самостоятельно (пожалуйста, прочитайте вики).
.dll в Windows, 7-Zip/ P7Zip .so Для построения библиотеки:
cd < bit7z folder >
mkdir build && cd build
cmake ../ -DCMAKE_BUILD_TYPE=Release
cmake --build . -j --config ReleaseБолее подробное руководство по созданию этой библиотеки доступно здесь.
Вы также можете напрямую интегрировать библиотеку в свой проект через Cmake:
third_party ) или добавьте его в качестве подмодуля вашего репозитория.add_subdirectory() в вашем CMakeLists.txt , чтобы включить Bit7z.bit7z , используя команду target_link_libraries() .Например:
add_subdirectory ( ${CMAKE_SOURCE_DIR} /third_party/bit7z )
target_link_libraries ( ${YOUR_TARGET} PRIVATE bit7z )Библиотека очень настраима: для подробного списка доступных вариантов сборки, пожалуйста, см. Вики.
Настройка Bit7Z через CMake автоматически загружает последнюю версию 7-Zip, поддерживаемую библиотекой.
При желании вы можете указать другую версию 7 -Zip через опцию Cmake BIT7Z_7ZIP_VERSION (например, -DBIT7Z_7ZIP_VERSION="22.01" ).
В качестве альтернативы, вы можете указать пользовательский путь, содержащий 7-zip-исходный код, через опцию BIT7Z_CUSTOM_7ZIP_PATH .
Обратите внимание, что в целом лучше всего использовать ту же версию 7-Zip общих библиотек, которые вы будете использовать во время выполнения.
По умолчанию Bit7Z совместим с 7z.so от 7-ZIP V23.01 и позже.
Если вы планируете использовать 7z.so от P7ZIP или 7-ZIP V22.01 и раньше, у вас есть два способа сделать Bit7Z совместимым:
-DBIT7Z_USE_LEGACY_IUNKNOWN=ON ; или-DBIT7Z_7ZIP_VERSION="22.01" ).На Linux и MacOS 7-Zip V23.01 ввел нарушающие изменения в интерфейс iunknown. В результате, если вы создаете Bit7Z для такой версии 7-Zip (по умолчанию), он не будет поддерживать использование общих библиотек из предыдущих версий 7-Zip (или от P7ZIP). И наоборот, Bit7Z, созданный для более ранних версий 7-Zip или для P7ZIP, несовместима с общими библиотеками из 7-ZIP V23.01 и позже.
Вы можете построить общие библиотеки 7-ZIP V23.01 в обратном совместимом режиме, определив макрос Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN . Если это ваш случай, вам нужно будет включить BIT7Z_USE_LEGACY_IUNKNOWN для работы BIT7Z (в данном случае BIT7Z будет совместим также с предыдущими версиями 7-ZIP/P7ZIP).
По умолчанию BIT7Z следует за MANIFESTO UTF-8 везде, чтобы упростить использование библиотеки в кроссплатформенных проектах. Короче говоря, это означает, что:
std::string .std::string s считаются кодированными UTF-8; Выходные std::string s кодированы UTF-8. В системах POSIX std::string S обычно уже кодируются UTF-8, и конфигурация не требуется.
Ситуация немного сложнее в Windows, поскольку по умолчанию Windows рассматривает std::string S как кодируемые с использованием страницы системы системного кода, которая не обязательно может быть UTF-8, например, Windows-1252.
Если ваша программа занимается исключительно с помощью строк только ASCII, вы должны быть в порядке с настройками BIT7Z по умолчанию (поскольку символы ASCII также являются UTF-8).
Однако, если вам нужно обрабатывать символы, не связанные с ASCII/Unicode, так как это вероятно, у вас есть следующие варианты:
Обеспечение с использованием кодовой страницы UTF-8 для всего вашего приложения, как объяснено Microsoft здесь:
Вручную обеспечивая кодирование std::string s прошло в Bit7Z:
ReadConsoleW ) и конвертируйте его в UTF-8 (Bit7z предоставляет функцию утилиты для этого, bit7z::to_tstring ).SetConsoleOutputCP(CP_UTF8) до. Настройка Bit7Z для использования кодированных UTF-16-строк (то есть std::wstring ), включив опцию BIT7Z_USE_NATIVE_STRING через cmake.
Если ваша программа только для Windows, или вы уже используете широкие строки в Windows, это может быть лучшим выбором, поскольку она избежит любых внутренних преобразований строк (7-Zip всегда использует широкие строки).
Эта опция делает разработку кроссплатформенных приложений немного неудобными, поскольку вам все равно придется использовать std::string в SOSIX Systems.
Библиотека обеспечивает тип псевдонима bit7z::tstring и макрофункциональная функция BIT7Z_STRING для определения широких струнных переменных и литералов на Windows и узких на других платформах.
Вы должны программно установить стандартный кодирование ввода и вывода в UTF-16 для правильного чтения и печати символов Unicode:
# include < fcntl.h > // for _O_U16TEXT
# include < io.h > // for _setmode
_setmode (_fileno(stdout), _O_U16TEXT); // setting the stdout encoding to UTF16
_setmode (_fileno(stdin), _O_U16TEXT); // setting the stdin encoding to UTF16 Настройка Bit7Z для использования кодирования страницы системного кода для std::string , включив опцию BIT7Z_USE_SYSTEM_CODEPAGE через Cmake.
Если вы нашли этот проект полезным, пожалуйста, рассмотрите возможность поддержать меня небольшим пожертвованием, чтобы я мог продолжать его улучшать! Спасибо!
Этот проект лицензирован в соответствии с условиями общественной лицензии Mozilla V2.0.
Для получения более подробной информации, пожалуйста, проверьте:
Старые версии (v3.x и ранее) из Bit7Z были выпущены в рамках общей публичной лицензии GNU V2.
В Windows вы должны связать свою программу также с OLEAUT32 (например, -lbit7z -loleaut32 ).
На Linux и MacOS вы должны связать свою программу также с DL (например, -lbit7z -ldl ).
Если вы используете библиотеку через CMAKE, эти зависимости будут автоматически связаны с вашим проектом. ↩
MSVC 2010 был поддержан до V2.x, MSVC 2012/2013 до V3.X. ↩
Bit7Z не отправляется с 7-Zip-общими библиотеками. Вы можете построить их из исходного кода, доступного по адресу 7-zip.org. ↩