C++ में ZIP-आर्काइव के साथ काम करना: सरल से जटिल तक
आधुनिक C++ विकास में, डेटा को पैक और अनपैक करने की आवश्यकता अक्सर उत्पन्न होती है। चाहे वह कॉन्फ़िगरेशन को सहेजना हो, लॉग ट्रांसफर करना हो या बैकअप बनाना हो — ZIP-आर्काइव के साथ काम करना सबसे अधिक मांग वाले कौशलों में से एक बना हुआ है। इस लेख में, हम दो लोकप्रिय लाइब्रेरीज़: libzip (आधिकारिक, शक्तिशाली) और miniz (हल्की, एकल-हेडर) का विस्तार से विश्लेषण करेंगे। आप सीखेंगे कि ZIP-आर्काइव कैसे बनाएं, पढ़ें और संशोधित करें, साथ ही तैयार कोड उदाहरण भी प्राप्त करेंगे।
ZIP ही क्यों?
ZIP प्रारूप दोषरहित संपीड़न का डी-फैक्टो मानक है। यह सभी ऑपरेटिंग सिस्टम द्वारा समर्थित है, कई फ़ाइलों और फ़ोल्डरों को संग्रहीत करने की अनुमति देता है, और एन्क्रिप्शन और स्ट्रीमिंग प्रोसेसिंग का भी समर्थन करता है। C++ में ZIP के लिए कोई अंतर्निहित समर्थन नहीं है (प्रायोगिक <filesystem> को छोड़कर), इसलिए हम तृतीय-पक्ष लाइब्रेरीज़ का उपयोग करते हैं।
libzip लाइब्रेरी: गंभीर कार्यों के लिए शक्तिशाली उपकरण
libzip C में एक क्रॉस-प्लेटफ़ॉर्म लाइब्रेरी है, जिसमें उत्कृष्ट C++-संगत API है। यह आर्काइव पर पूर्ण नियंत्रण प्रदान करता है: निर्माण, पढ़ना, संशोधन, फ़ाइलें हटाना, टिप्पणियों और मेटाडेटा के साथ काम करना।
libzip स्थापित करना (Linux/macOS)
# Ubuntu/Debiansudo apt-get install libzip-dev
# macOS (Homebrew)brew install libzip
# Windows — vcpkg के माध्यम से या libzip.org से डाउनलोड करेंउदाहरण 1: ZIP-आर्काइव बनाना
हम example.zip आर्काइव बनाएंगे और उसमें एक टेक्स्ट फ़ाइल जोड़ेंगे।
#include <zip.h>#include <iostream>#include <string>
int main() { // आर्काइव को लिखने के लिए खोलें (APPEND_CREATE नया बनाएगा) int err = 0; zip_t *archive = zip_open("example.zip", ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "आर्काइव बनाने में त्रुटि: " << err << std::endl; return 1; }
// फ़ाइल के लिए डेटा const char *content = "PythonLib से नमस्ते!"; zip_source_t *source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "डेटा स्रोत बनाने में विफल" << std::endl; zip_close(archive); return 1; }
// आर्काइव में फ़ाइल जोड़ें zip_int64_t index = zip_file_add(archive, "hello.txt", source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "फ़ाइल जोड़ने में विफल: " << zip_strerror(archive) << std::endl; zip_source_free(source); zip_close(archive); return 1; }
// आर्काइव बंद करें zip_close(archive); std::cout << "आर्काइव सफलतापूर्वक बनाया गया!" << std::endl; return 0;}उदाहरण 2: आर्काइव से सभी फ़ाइलें अनपैक करना
हम आर्काइव को पढ़ेंगे और सभी फ़ाइलों को वर्तमान निर्देशिका में निकालेंगे।
#include <zip.h>#include <iostream>#include <fstream>
int main() { int err = 0; zip_t *archive = zip_open("example.zip", ZIP_RDONLY, &err); if (!archive) { std::cerr << "आर्काइव खोलने में त्रुटि" << std::endl; return 1; }
zip_int64_t num_entries = zip_get_num_entries(archive, 0); for (zip_int64_t i = 0; i < num_entries; ++i) { // फ़ाइल का नाम प्राप्त करें const char *filename = zip_get_name(archive, i, 0); if (!filename) continue;
// आर्काइव के अंदर फ़ाइल खोलें zip_file_t *zf = zip_fopen_index(archive, i, 0); if (!zf) { std::cerr << "खोलने में विफल: " << filename << std::endl; continue; }
// डेटा पढ़ें और फ़ाइल में लिखें char buffer[1024]; std::ofstream out(filename, std::ios::binary); zip_int64_t bytes_read; while ((bytes_read = zip_fread(zf, buffer, sizeof(buffer))) > 0) { out.write(b