C++ में ZIP/आर्काइव के साथ काम: लाइब्रेरी का अवलोकन और व्यावहारिक उदाहरण
डेटा आर्काइव करना सॉफ्टवेयर डेवलपमेंट में एक महत्वपूर्ण कार्य है। C++ में ZIP फॉर्मेट के लिए कोई बिल्ट-इन सपोर्ट नहीं है, लेकिन कई परिपक्व और परीक्षित लाइब्रेरी मौजूद हैं जो ZIP आर्काइव को आसानी से पैक, अनपैक और मॉडिफाई करने की सुविधा देती हैं। इस लेख में हम मुख्य टूल्स: zlib, minizip और libzip पर चर्चा करेंगे, साथ ही व्यावहारिक कोड उदाहरण भी देंगे।
1. C++ में ZIP के साथ काम करने की बुनियादी अवधारणाएँ
ZIP एक लॉसलेस कंप्रेशन फॉर्मेट है जो कई एल्गोरिदम (Deflate, BZip2, LZMA) को सपोर्ट करता है। C++ में इसके साथ काम करने के लिए आमतौर पर तीन तरीके अपनाए जाते हैं:
- zlib के साथ सीधा काम — डेटा स्ट्रीम का लो-लेवल कंप्रेशन/डीकंप्रेशन, लेकिन ZIP फ़ाइल संरचना का सपोर्ट नहीं।
- minizip — zlib के ऊपर एक रैपर, जो ZIP आर्काइव बनाने और पढ़ने के लिए फंक्शन प्रदान करता है।
- libzip — एक पूर्ण-सुविधा संपन्न लाइब्रेरी जो मौजूदा आर्काइव में फ़ाइलों को एडिट, डिलीट और जोड़ने का सपोर्ट करती है।
2. zlib लाइब्रेरी
zlib एक बुनियादी कंप्रेशन लाइब्रेरी है जिस पर कई ZIP समाधान आधारित हैं। यह रॉ डेटा के साथ काम करने के लिए compress() और uncompress() फंक्शन प्रदान करती है।
उदाहरण: zlib के साथ स्ट्रिंग को कंप्रेस करना
#include <iostream>
#include <string>
#include <zlib.h>
int main() {
std::string input = "C++ में कंप्रेशन के लिए नमूना टेक्स्ट!";
uLong srcLen = input.size();
uLong destLen = compressBound(srcLen);
char* compressed = new char[destLen];
if (compress((Bytef*)compressed, &destLen,
(const Bytef*)input.data(), srcLen) == Z_OK) {
std::cout << "कंप्रेस किया गया: " << srcLen << " -> " << destLen << " बाइट\n";
}
delete[] compressed;
return 0;
}
नोट: zlib के साथ काम करने के लिए हेडर फ़ाइल zlib.h को शामिल करना और लाइब्रेरी -lz से लिंक करना आवश्यक है।
3. minizip लाइब्रेरी
minizip zlib के ऊपर एक हल्का रैपर है जो ZIP आर्काइव बनाने और निकालने की अनुमति देता है। यह zlib सोर्स कोड (फ़ोल्डर contrib/minizip) के साथ वितरित किया जाता है।
उदाहरण: एक फ़ाइल के साथ ZIP आर्काइव बनाना
#include <iostream>
#include <zip.h> // minizip
int main() {
zipFile zf = zipOpen("example.zip", APPEND_STATUS_CREATE);
if (!zf) {
std::cerr << "आर्काइव बनाने में त्रुटि\n";
return 1;
}
zip_fileinfo info = {0};
const char* filename = "test.txt";
const char* content = "minizip से नमस्ते!";
if (zipOpenNewFileInZip(zf, filename, &info,
nullptr, 0, nullptr, 0,
nullptr, Z_DEFLATED, Z_DEFAULT_COMPRESSION) == ZIP_OK) {
zipWriteInFileInZip(zf, content, strlen(content));
zipCloseFileInZip(zf);
}
zipClose(zf, nullptr);
std::cout << "आर्काइव बनाया गया: example.zip\n";
return 0;
}
उदाहरण: ZIP से सभी फ़ाइलें निकालना
#include <iostream>
#include <unzip.h>
int main() {
unzFile uf = unzOpen("example.zip");
if (!uf) {
std::cerr << "आर्काइव खोलने में विफल\n";
return 1;
}
unz_global_info global_info;
unzGetGlobalInfo(uf, &global_info);
for (uLong i = 0; i < global_info.number_entry; ++i) {
char filename[256];
unz_file_info file_info;
unzGetCurrentFileInfo(uf, &file_info, filename, sizeof(filename),
nullptr, 0, nullptr, 0);
if (unzOpenCurrentFile(uf) == UNZ_OK) {
char buffer[1024];
int bytes_read;
std::cout << "निकाला जा रहा है: " << filename << std::endl;
while ((bytes_read = unzReadCurrentFile(uf, buffer, sizeof(buffer))) > 0) {
// फ़ाइल में लिखें या प्रोसेस करें
}
unzCloseCurrentFile(uf);
}
if (i < global_info.number_entry - 1) {
unzGoToNextFile(uf);
}
}
unzClose(uf);
return 0;
} पुस्तकालय में भी
PHP अनुप्रयोग कॉन्फ़िगरेशन: लचीली सेटिंग्स के लिए लाइब्रेरी और उपकरण
PHP में छवियों के साथ काम करना: लाइब्रेरी और टूल्स का अवलोकन