지원되는 기능 • 시작하기 • 다운로드 • 요구 사항 • 구축 및 사용 • 기부 • 라이센스
Bit7Z 는 크로스 플랫폼 C ++ 정적 라이브러리로, 깨끗 하고 간단한 래퍼 인터페이스를 통해 7-ZIP 프로젝트의 동적 라이브러리로 아카이브 파일의 압축/추출을 허용합니다.
파일 시스템 또는 메모리에 대한 압축 및 추출, Archives Metadata, 기존 아카이브 업데이트, 멀티 볼륨 아카이브 작성, 운영 진행 콜백 및 기타 여러 기능을 지원합니다.
위의 특징 중 일부의 존재 여부는 비트 7Z와 함께 사용되는 특정 공유 라이브러리에 따라 다릅니다.
예를 들어, 7z.dll은 이러한 모든 기능을 지원해야하며 7za.dll은 7Z 파일 형식에서만 작동하고 7ZXA.dll은 7Z 파일 만 추출 할 수 있습니다. 7-zip dlls에 대한 자세한 내용은이 위키 페이지를 확인하십시오.
결국, 기본적으로 일부 다른 기능 (예 : 자동 형식 감지 및 정규 표현식을 사용한 선택적 추출 )은 기본적으로 비활성화되며, 컴파일 중에 매크로 정의를 사용하여 이용 가능 (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()... */ }Wiki 섹션에서 전체 API 참조를 사용할 수 있습니다.
최신 BIT7Z V4는 라이브러리의 API에 대한 몇 가지 중대한 파괴 변경을 도입했습니다.
std::string ( std::wstring 대신)이므로 사용자는 크로스 플랫폼 프로젝트에서 라이브러리를보다 쉽게 사용할 수 있습니다 (V4 도입 Linux/MacOS 지원도).std::string s는 UTF-8 인코딩으로 간주됩니다.-DBIT7Z_USE_NATIVE_STRING cmake 옵션을 사용하여 Windows에서 이전 동작을 계속 달성 할 수 있습니다.BitExtractor 클래스는 이제 BitFileExtractor 라고합니다.BitExtractor 모든 추출 클래스의 템플릿 클래스의 이름 일뿐입니다.BitCompressor 클래스는 이제 BitFileCompressor 라고합니다.BitCompressor 모든 압축 클래스의 템플릿 클래스의 이름 일뿐입니다.ProgressCallback 현재 작업이 계속 될 수 있는지 ( true ) ( false )를 유지할 수 있는지 여부를 나타내는 bool 값을 반환해야합니다.include/ include/bit7z/ 폴더로 이동 했으므로 #include 지시문은 이제 포함 된 헤더 이름 (예 : #include <bit7z/bitfileextractor.hpp> )으로 bit7z/ 준비해야합니다.lib/<architecture>/ 입니다. Cmake 생성기가 멀티 콘피드 (예 : Visual Studio Generator) 인 경우 기본 출력 폴더는 lib/<architecture>/<build type>/ 입니다.BIT7Z_VS_LIBNAME_OUTDIR_STYLE CMAKE 옵션을 활성화하여 "Visual Studio Style"출력 경로를 강제로 사용할 수 있습니다.릴리스 된 각 패키지에는 다음이 포함됩니다.
패키지는 X86 및 X64 아키텍처 모두에 사용할 수 있습니다.
이 저장소를 복제/다운로드하고 라이브러리를 직접 구축 할 수도 있습니다 (위키를 읽으십시오).
.dll 라이브러리, UNIX 3 의 7-zip/p7zip .so 라이브러리. 도서관 구축 :
cd < bit7z folder >
mkdir build && cd build
cmake ../ -DCMAKE_BUILD_TYPE=Release
cmake --build . -j --config Release이 라이브러리 구축 방법에 대한 자세한 안내서는 여기에서 확인할 수 있습니다.
CMAKE를 통해 라이브러리를 프로젝트에 직접 통합 할 수도 있습니다.
third_party )로 복사하거나 저장소의 git 하위 모듈로 추가하십시오.CMakeLists.txt 에서 add_subdirectory() 명령을 사용하여 bit7z를 포함하십시오.target_link_libraries() 명령을 사용하여 bit7z 라이브러리를 연결하십시오.예를 들어:
add_subdirectory ( ${CMAKE_SOURCE_DIR} /third_party/bit7z )
target_link_libraries ( ${YOUR_TARGET} PRIVATE bit7z )라이브러리는 고도로 사용자 정의 할 수 있습니다. 사용 가능한 빌드 옵션의 자세한 목록은 위키를 참조하십시오.
CMake를 통해 Bit7Z를 구성하는 동안 라이브러리에서 지원하는 최신 7-ZIP 버전을 자동으로 다운로드합니다.
선택적으로 CMAKE 옵션 BIT7Z_7ZIP_VERSION (예 : -DBIT7Z_7ZIP_VERSION="22.01" )을 통해 다른 버전의 7 -ZIP를 지정할 수 있습니다.
또는 옵션 BIT7Z_CUSTOM_7ZIP_PATH 옵션을 통해 7-zip 소스 코드가 포함 된 사용자 정의 경로를 지정할 수 있습니다.
일반적으로 런타임에 사용할 공유 라이브러리의 동일한 버전의 7-zip을 사용하는 것이 가장 좋습니다.
기본적으로 Bit7Z는 7z.so 와 7-ZIP v23.01 이상에서 호환됩니다.
P7ZIP 또는 7-ZIP V22.01에서 7z.so 사용하려는 경우 Bit7Z를 호환하는 두 가지 방법이 있습니다.
-DBIT7Z_USE_LEGACY_IUNKNOWN=ON ; 또는-DBIT7Z_7ZIP_VERSION="22.01" ).Linux 및 MacOS에서 7-Zip V23.01은 iunknown 인터페이스의 파괴 변경을 도입했습니다. 결과적으로 7-zip (기본값) 버전에 대해 Bit7Z를 구축하면 이전 버전의 7-ZIP (또는 P7ZIP)의 공유 라이브러리를 사용하는 것이 지원되지 않습니다. 반대로, 이전 버전의 7-zip 또는 p7zip 용 비트 7Z는 7-zip v23.01 이상의 공유 라이브러리와 호환되지 않습니다.
매크로 Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN 정의하여 후진 호환 모드로 7-ZIP v23.01의 공유 라이브러리를 구축 할 수 있습니다. 이 경우 Bit7Z가 작동하도록 BIT7Z_USE_LEGACY_IUNKNOWN 을 활성화해야합니다 (이 경우 Bit7Z는 이전 버전의 7-ZIP/P7ZIP 와도 호환됩니다).
기본적으로 Bit7Z는 UTF-8 Everywhere Disfesto를 따라 크로스 플랫폼 프로젝트 내에서 라이브러리의 사용을 단순화합니다. 요컨대, 이것은 다음을 의미합니다.
std::string 입니다.std::string s는 UTF-8 인코딩으로 간주됩니다. 출력 std::string s는 UTF-8 인코딩되어 있습니다. POSIX 시스템에서 std::string s는 일반적으로 이미 UTF-8 인코딩되어 있으며 구성이 필요하지 않습니다.
Windows는 기본적으로 Windows가 std::string 을 시스템 코드 페이지를 사용하여 인코딩 된대로 취급하기 때문에 Windows에서는 Windows에서 약간 더 복잡합니다. 예를 들어 Windows-1252와 같이 반드시 UTF-8 일 수는 없습니다.
프로그램이 Ascii-only 문자열 을만해도 처리하는 경우 기본 비트 7Z 설정에 적합해야합니다 (ASCII 문자도 UTF-8이므로).
그러나 비 ASCII/유니 코드 문자를 처리 해야하는 경우 다음과 같은 옵션이 있습니다.
Microsoft에서 설명한대로 전체 응용 프로그램에 대한 UTF-8 코드 페이지를 사용하여 시행합니다.
std::string s의 인코딩을 수동으로 bit7z로 전달하는지 확인하십시오.
ReadConsoleW 를 통해)으로 읽고 UTF-8로 변환합니다 ( bit7z::to_tstring 는 이에 대한 유틸리티 함수를 제공합니다.SetConsoleOutputCP(CP_UTF8) 호출하여 Bit7Z (예 : 아카이브 파일의 경로/이름 메타 데이터)에서 콘솔로 UTF-8 출력 문자열을 올바르게 인쇄 할 수 있습니다. cmake를 통해 BIT7Z_USE_NATIVE_STRING 옵션을 활성화하여 UTF-16 std::wstring 사용하도록 Bit7Z를 구성합니다.
프로그램이 Windows 전용이거나 Windows에서 이미 넓은 문자열을 사용하는 경우 내부 문자열 변환을 피하기 때문에 최상의 선택 일 수 있습니다 (7- Zip은 항상 넓은 문자열을 사용합니다).
이 옵션은 Posix 시스템에서 std::string 사용해야하기 때문에 크로스 플랫폼 응용 프로그램을 약간 불편하게 만듭니다.
라이브러리는 유형 별명 bit7z::tstring 제공하고 매크로 함수 BIT7Z_STRING 제공하여 Wind
UTF-16으로 표준 입력 및 출력 인코딩을 프로그래밍 방식으로 설정하여 유니 코드 문자를 올바르게 읽고 인쇄해야합니다.
# 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 의 인코딩을 사용하여 cmake를 통해 BIT7Z_USE_SYSTEM_CODEPAGE 옵션을 활성화합니다.
이 프로젝트가 도움이된다면, 계속 개선 할 수 있도록 작은 기부금으로 저를 지원하는 것을 고려하십시오! 감사합니다!
이 프로젝트는 Mozilla Public License v2.0의 조건에 따라 라이센스가 부여됩니다.
자세한 내용은 다음을 확인하십시오.
BIT7Z의 구형 버전 (V3.X 및 이전)은 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에서 사용 가능한 소스 코드에서 빌드 할 수 있습니다. ↩