サポートされている機能•開始•ダウンロード•要件•構築と使用•寄付•ライセンス
BIT7Zは、7-ZIPプロジェクトのダイナミックライブラリへのクリーンでシンプルなラッパーインターフェイスを介してアーカイブファイルの圧縮/抽出を可能にするクロスプラットフォームC ++静的ライブラリです。
ファイルシステムまたはメモリとの間での圧縮と抽出、メタデータの読み取り、既存のメタデータの読み取り、マルチボリュームアーカイブの作成、操作の進行状況コールバック、およびその他の多くの機能をサポートします。
上記の機能のいくつかの存在感は、BIT7Zとともに使用される特定の共有ライブラリに依存します。
たとえば、7Z.DLLはこれらすべての機能をサポートする必要があり、7ZA.DLLは7Zファイル形式でのみ動作する必要があり、7ZXA.DLLは7Zファイルのみを抽出できます。 7-ZIP DLLの詳細については、このWikiページを確認してください。
最終的に、他のいくつかの機能(例えば、正規表現を使用した自動形式の検出と選択的抽出)はデフォルトで無効になり、コンパイル中にマクロ定義を使用して使用できるようにする必要があります(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できるかどうかを示すbool値を返す必要があります( false )。include/ to include/bit7z/フォルダーに移動したパブリックAPIヘッダーがあるため、 #includeディレクティブは、付属のヘッダー名( #include <bit7z/bitfileextractor.hpp>など)にbit7z/を準備する必要があります。lib/<architecture>/になりました。 cmakeジェネレーターがマルチコンフィグ(たとえば、ビジュアルスタジオジェネレーター)の場合、デフォルトの出力フォルダーはlib/<architecture>/<build type>/です。BIT7Z_VS_LIBNAME_OUTDIR_STYLE cmakeオプションを有効にすることにより、「ビジュアルスタジオスタイル」出力パスを使用して強制できます。リリースされた各パッケージには次のものが含まれています。
パッケージは、 X86およびX64アーキテクチャの両方で使用できます。
また、このリポジトリをクローン/ダウンロードして自分でライブラリを構築することもできます(Wikiをお読みください)。
.dllライブラリ、7-ZIP/P7ZIP .so UNIX 3のライブラリ。 図書館を構築するために:
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 )ライブラリは非常にカスタマイズ可能です。利用可能なビルドオプションの詳細なリストについては、Wikiを参照してください。
Cmakeを介してBIT7Zを構成している間、ライブラリでサポートされている7-ZIPの最新バージョンを自動的にダウンロードします。
オプションで、CMAKEオプションBIT7Z_7ZIP_VERSION (例、 -DBIT7Z_7ZIP_VERSION="22.01" )を介して7 -zipの異なるバージョンを指定できます。
または、オプションBIT7Z_CUSTOM_7ZIP_PATHを介して7-zipソースコードを含むカスタムパスを指定することもできます。
一般的に、実行時に使用する共有ライブラリの7-zipの同じバージョンを使用することをお勧めします。
デフォルトでは、BIT7Zは7-ZIP V23.01以降の7z.soと互換性があります。
P7ZIPまたは7-ZIP V22.01以前から7z.soを使用する予定がある場合は、BIT7Zを互換性のある2つの方法があります。
-DBIT7Z_USE_LEGACY_IUNKNOWN=ON ;でbit7zを構成します。または-DBIT7Z_7ZIP_VERSION="22.01" )のbit7zを構成します。LinuxとMacOSでは、7-ZIP V23.01がIUNKNOWNインターフェイスに壊れた変更を導入しました。その結果、7-ZIP(デフォルト)のこのようなバージョンにBIT7Zを構築する場合、7-ZIPの以前のバージョン(またはP7ZIPから)の共有ライブラリを使用してサポートしません。逆に、7-ZIPまたはP7ZIPの以前のバージョン用に作成されたBIT7Zは、7-ZIP V23.01以降の共有ライブラリと互換性がありません。
マクロZ7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWNを定義することにより、7-ZIP V23.01の共有ライブラリを後方互換モードで構築できます。この場合、 BIT7Z_USE_LEGACY_IUNKNOWN BIT7Zを機能させることを有効にする必要があります(この場合、BIT7Zは7-ZIP/P7ZIPの以前のバージョンとも互換性があります)。
デフォルトでは、BIT7Zは、クロスプラットフォームプロジェクト内のライブラリの使用を簡素化するために、どこでもUTF-8のマニフェストに従います。要するに、これは次のことを意味します
std::stringです。std::string SはUTF-8エンコードと見なされます。出力std::string SはUTF-8エンコードされています。 POSIXシステムでは、 std::string Sは通常既にUTF-8エンコードされており、構成は必要ありません。
Windowsは、Windowsではもう少し複雑です。デフォルトでは、Windowsはシステムコードページを使用してエンコードされたstd::string Sを扱います。これは、たとえばWindows-1252のように、必ずしもUTF-8ではない場合があります。
プログラムがAscii-Only文字列のみを扱っている場合は、デフォルトのBIT7Z設定で問題ありません(ASCII文字もUTF-8です)。
ただし、非ASCII/Unicode文字を処理する必要がある場合は、次のオプションがあります。
ここでMicrosoftで説明されているように、アプリケーション全体にUTF-8コードページを使用して実施します。
std::string sのエンコーディングを手動で保証します。
ReadConsoleWを介して)として読み取り、それをUTF-8に変換します(BIT7Zは、これのユーティリティ関数を提供しますbit7z::to_tstring )。SetConsoleOutputCP(CP_UTF8)を呼び出すことにより、bit7z(アーカイブ内のファイルのパス/名前メタデータ)からコンソールにUTF-8出力文字列を正しく印刷できます。 cmakeを介してBIT7Z_USE_NATIVE_STRINGオプションを有効にすることにより、bit7zをUTF-16エンコードされたワイドストリング(つまり、 std::wstring )を使用するように構成します。
プログラムがWindowsのみである場合、またはWindowsで幅の広い文字列を既に使用している場合、これは内部文字列変換を避けるため、最良の選択かもしれません(7-zipは常に幅の広い文字列を使用します)。
このオプションは、POSIXシステムでstd::string使用する必要があるため、クロスプラットフォームアプリケーションの開発をわずかに不便にします。
ライブラリは、タイプエイリアスbit7z::tstringと、他のプラットフォーム上のWindowsおよび狭い変数で幅広い文字列変数とリテラルを定義するためのマクロ関数BIT7Z_STRING提供します。
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 cmakeを介してBIT7Z_USE_SYSTEM_CODEPAGEオプションを有効にすることによりstd::stringのシステムコードページを使用するようにbit7zを構成します。
このプロジェクトが役立つことがわかった場合は、私がそれを改善し続けることができるように、少量の寄付で私をサポートすることを検討してください!ありがとう!
このプロジェクトは、Mozilla Public License v2.0の条件の下でライセンスされています。
詳細については、確認してください。
BIT7Zの古いバージョン(V3.X以前)は、GNU General Public License 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で利用可能なソースコードからそれらを構築できます。 ↩