الميزات المدعومة • البدء • التنزيل • المتطلبات • البناء والاستخدام • التبرع • الترخيص
Bit7Z عبارة عن مكتبة ثابتة C ++ منصة تسمح بضغط/استخراج ملفات الأرشيف من خلال واجهة غلاف نظيفة وبسيطة للمكتبات الديناميكية من مشروع 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 الكامل في قسم الويكي.
قدم أحدث Bit7Z V4 بعض التغييرات الهامة في واجهة برمجة تطبيقات المكتبة.
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/ to the include/bit7z/ Folder ، لذلك تحتاج الآن إلى توجيهات #include إلى إعداد bit7z/ إلى اسم الرأس المضمّن (على سبيل المثال ، #include <bit7z/bitfileextractor.hpp> ).lib/<architecture>/ ؛ إذا كان مولد CMAKE متعدد المجلدات (على سبيل المثال ، مولدات الاستوديو المرئية) ، فإن مجلد الإخراج الافتراضي هو lib/<architecture>/<build type>/ .BIT7Z_VS_LIBNAME_OUTDIR_STYLE CMAKE.تحتوي كل حزمة تم إصدارها على:
تتوفر الحزم لكل من بنيات X86 و X64 .
يمكنك أيضًا استنساخ/تنزيل هذا المستودع وبناء المكتبة بنفسك (من فضلك ، قراءة الويكي).
.dll على Windows ، مكتبة 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 ) ، أو إضافته كوحدة فرعية من مستودعك.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 بيان 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 كما هو مشفر باستخدام صفحة رمز النظام ، والتي قد لا تكون بالضرورة 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 على أنظمة Posix.
توفر المكتبة نوعًا من 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 Public 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. ↩