คุณสมบัติที่รองรับ•การเริ่มต้น•การดาวน์โหลด•ข้อกำหนด•อาคารและการใช้•บริจาค•ใบอนุญาต
BIT7Z เป็นไลบรารี c ++ cross-platform ที่อนุญาตให้มี การบีบอัด/สกัดไฟล์เก็บถาวร ผ่านอินเทอร์เฟซ wrapper ที่สะอาด และ เรียบง่าย ไปยังไลบรารีไดนามิกจากโครงการ 7-Zip
รองรับการบีบอัดและการสกัดไปและกลับจากระบบไฟล์หรือหน่วยความจำการอ่านคลังข้อมูลข้อมูลเมตาการอัพเดตที่มีอยู่การสร้างคลังเก็บหลายเล่มการเรียกกลับการเรียกคืนการดำเนินการและฟังก์ชั่นอื่น ๆ อีกมากมาย
การปรากฏตัวหรือไม่ของคุณสมบัติบางอย่างข้างต้นขึ้นอยู่กับห้องสมุดที่ใช้ร่วมกันโดยเฉพาะที่ใช้พร้อมกับ BIT7Z
ตัวอย่างเช่น 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()... */ }การอ้างอิง API ที่สมบูรณ์มีอยู่ในส่วน Wiki
BIT7Z V4 ใหม่ล่าสุดแนะนำการเปลี่ยนแปลงที่สำคัญบางอย่างกับ API ของห้องสมุด
std::string (แทนที่จะเป็น std::wstring ) ดังนั้นผู้ใช้สามารถใช้ไลบรารีในโครงการข้ามแพลตฟอร์มได้ง่ายขึ้น (V4 แนะนำการสนับสนุน Linux/MacOS ด้วย)std::string s จะถูกพิจารณาว่าเป็น UTF-8 ที่เข้ารหัส-DBIT7Z_USE_NATIVE_STRING CMAKEBitExtractor เก่าเรียกว่า BitFileExtractorBitExtractor เป็นเพียงชื่อของคลาสเทมเพลตสำหรับคลาสการสกัดทั้งหมดBitCompressor เก่าเรียกว่า BitFileCompressorBitCompressor เป็นเพียงชื่อของคลาสเทมเพลตสำหรับคลาสการบีบอัดทั้งหมดProgressCallback ในขณะนี้จะต้องส่งคืนค่า bool ที่ระบุว่าการดำเนินการปัจจุบันสามารถดำเนินการต่อ ( true ) หรือไม่ ( false )include/ ไปยัง include/bit7z/ โฟลเดอร์ดังนั้น #include Directives จึงจำเป็นต้องเตรียม bit7z/ ไปยังชื่อส่วนหัวที่รวมอยู่ (เช่น #include <bit7z/bitfileextractor.hpp> )lib/<architecture>/ ; หากเครื่องกำเนิด CMake เป็น multi-config (เช่นเครื่องกำเนิดไฟฟ้าสตูดิโอ Visual) โฟลเดอร์เอาต์พุตเริ่มต้นคือ lib/<architecture>/<build type>/BIT7Z_VS_LIBNAME_OUTDIR_STYLE CMAKEแต่ละแพ็คเกจที่เปิดตัวมี:
แพ็คเกจมีให้สำหรับสถาปัตยกรรม X86 และ X64
นอกจากนี้คุณยังสามารถโคลน/ดาวน์โหลดที่เก็บนี้และสร้างห้องสมุดด้วยตัวเอง (โปรดอ่าน wiki)
.dll บน Windows, 7-Zip/P7Zip .so Library บน Unix 3 สำหรับการสร้างห้องสมุด:
cd < bit7z folder >
mkdir build && cd build
cmake ../ -DCMAKE_BUILD_TYPE=Release
cmake --build . -j --config Releaseคู่มือรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการสร้างห้องสมุดนี้มีอยู่ที่นี่
นอกจากนี้คุณยังสามารถรวมไลบรารีลงในโครงการของคุณโดยตรงผ่าน CMake:
third_party ) หรือเพิ่มเป็น submodule ของพื้นที่เก็บข้อมูลของคุณadd_subdirectory() ใน CMakeLists.txt ของคุณเพื่อรวม bit7zbit7z โดยใช้คำสั่ง 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 จะติดตาม UTF-8 Everywhere Manifesto เพื่อลดความซับซ้อนของการใช้ห้องสมุดภายในโครงการข้ามแพลตฟอร์ม ในระยะสั้นนี่หมายความว่า:
std::stringstd::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-only only โดยเฉพาะคุณควรจะดีกับการตั้งค่า 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-only หรือคุณใช้ Strings Wide บน Windows แล้วนี่อาจเป็นตัวเลือกที่ดีที่สุดเนื่องจากจะหลีกเลี่ยงการแปลงสตริงภายใน (7-Zip ใช้สตริงกว้างเสมอ)
ตัวเลือกนี้ทำให้การพัฒนาแอพพลิเคชั่นข้ามแพลตฟอร์มไม่สะดวกเล็กน้อยเนื่องจากคุณยังต้องใช้ std::string on Posix Systems
ไลบรารีจัดเตรียมประเภทนามแฝง bit7z::tstring และฟังก์ชั่นแมโคร 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 การกำหนดค่า 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