zlib

2012-07-23 18 views
5

का उपयोग कर एक ज़िप फ़ाइल को अनजिप करें मेरे पास एक archive.zip है जिसमें दो क्रिप्ट ".txt" फ़ाइलें हैं। मैं उन 2 फ़ाइलों को पुनर्प्राप्त करने के लिए संग्रह को डिक्रॉप करना चाहता हूं।zlib

यहाँ मैं अब तक क्या किया है है:

FILE *FileIn = fopen("./archive.zip", "rb"); 
if (FileIn) 
    printf("file opened\n"); 
else 
    printf("unable to open file\n"); 

fseek(FileIn, 0, SEEK_END); 
unsigned long FileInSize = ftell(FileIn); 
printf("size of input compressed file : %u\n", FileInSize); 

void *CompDataBuff = malloc(FileInSize); 
void *UnCompDataBuff = NULL; 

int fd = open ("archive.zip", O_RDONLY); 
CompDataBuff = mmap(NULL, FileInSize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); 
printf("buffer read : %s\n", (char *)CompDataBuff); 

uLongf UnCompSize = (FileInSize * 11/10 + 12); 
UnCompDataBuff = malloc(UnCompSize); 

int ret_uncp ; 

ret_uncp = uncompress((Bytef*)UnCompDataBuff, &UnCompSize, (const Bytef*)CompDataBuff,FileInSize); 
printf("size of uncompressed data : %u\n", UnCompSize); 

if (ret_uncp == Z_OK){ 
    printf("uncompression ok\n"); 
    printf("uncompressed data : %s\n",(char *)UnCompDataBuff); 
    } 
if (ret_uncp == Z_MEM_ERROR) 
    printf("uncompression memory error\n"); 
if (ret_uncp == Z_BUF_ERROR) 
    printf("uncompression buffer error\n"); 
if (ret_uncp == Z_DATA_ERROR) 
    printf("uncompression data error\n"); 

मैं हमेशा "असंपीड़न डेटा त्रुटि" हो जाते हैं और मैं पता नहीं क्यों। और फिर मैं जानना चाहता हूं कि मेरे डेटा के साथ 2 फ़ाइलों को असम्पीडित कैसे किया जाए।

उत्तर

4

ज़्लिब .zip फ़ाइलों को संभालने के लिए लाइब्रेरी नहीं है। यह zlib और gzip streams को डिकंप्रेस करने का समर्थन करता है, जिनमें से दोनों डेटा की एक स्ट्रीम के स्तर पर काम करते हैं, जैसे कि "संग्रह" प्रारूप .zip।

आपको एक अलग पुस्तकालय की आवश्यकता होगी (एक उदाहरण के लिए, libzip; कई अन्य हैं) .zip अभिलेखागार खोलने और कुशल बनाने के लिए।

+0

ओह वास्तव में, मैं यह सुनिश्चित करें कि zlib ज़िप के साथ सौदा होता था .. वैसे भी जानकारी के लिए धन्यवाद! :) – user1336204

+0

zlib वास्तव में ज़िप प्रसंस्करण के साथ मदद कर सकता है, और स्रोत वितरण ज़िप फ़ाइलों को संसाधित करने के लिए योगदान कोड के साथ आता है। मेरा जवाब देखें –

+1

ओह, और libzip zlib का उपयोग करता है। –

12

ज़िप एक फ़ाइल प्रारूप है जो फ़ाइलों और निर्देशिकाओं के एक समूह का प्रतिनिधित्व करने के लिए संपीड़ित डेटा स्ट्रीम के आसपास हेडर और ट्रेलर जानकारी लपेटता है। संपीड़ित डेटा स्ट्रीम लगभग हमेशा deflate data streams होती हैं, जो वास्तव में जेलीब द्वारा उत्पन्न और डीकोड की जा सकती हैं। zlib crc32 फ़ंक्शन भी प्रदान करता है जिसका उपयोग ज़िप रैपर जानकारी में क्रैक मान उत्पन्न करने और जांचने के लिए किया जा सकता है।

जो zlib स्वयं ही नहीं करता है वह ज़िप संरचना को डीकोड और डीकोनस्ट्रक्चर करता है। आप specification (बहुत कठिन नहीं) का उपयोग करके ऐसा करने के लिए अपना स्वयं का कोड लिख सकते हैं, या आप zlib distribution के contrib/minizip directory में मिनीज़िप रूटीन का उपयोग कर सकते हैं, जो ज़िप फ़ाइलों को खोलने, एक्सेस करने और बंद करने के लिए फ़ंक्शंस प्रदान करता है।

+0

धन्यवाद। मैंने contrib/minizip शीर्षलेख जोड़े और एक ज़िप से फ़ाइलों को पढ़ने में सक्षम था (एक ऐसे अनुप्रयोग में जो पहले से ही zlib का उपयोग कर रहा था)।मुझे unzip.h में इंटरफ़ेस में कॉल लपेटने के लिए बस कुछ सरल फ़ंक्शन लिखना पड़ा –

2

जैसा कि बताया गया है, zlib केवल संपीड़न को संभालता है, यह संग्रह नहीं करता है। जब आप जो कर रहे हैं उसे ज़िप या अनजिप करना चाहते हैं, तो एक ज़िप से प्रारूप में होने वाली संग्रह से फ़ाइलों को निकालना (रार, 7zip और अन्य जैसे अन्य प्रारूप हैं)

यदि आप ज़िप या अनजिप बनाना चाहते हैं फ़ाइलों को ज़िप प्रारूप और मिनीजिप को संभालने के लिए आपको एक अच्छी लाइब्रेरी है, मजबूत और काफी लंबे समय तक वहां रहा है।

मिनीज़िप https://github.com/nmoinvaz/minizip के लिए इसका उपयोग करने के उदाहरणों के साथ एक contrib है। यह कठिन नहीं है, और आप इसका उपयोग कैसे करें इसके बारे में कोड के लिए minizip.c और miniunz.c को देख सकते हैं। (Minizip संपीड़न के लिए zlib का उपयोग करता है)

इसके अलावा मैं एक पुस्तकालय है कि minizip लपेटता है और इसे करने के लिए अच्छा सुविधाओं में से एक गुच्छा कहते हैं और यह आसान उपयोग करने के लिए और अधिक वस्तु उन्मुख बनाता है के निर्माण के समाप्त हो गया। आपको ज़िप फ़ोल्डर्स, स्ट्रीम, वैक्टर इत्यादि जैसी चीजें करने के साथ-साथ पूरी तरह से स्मृति में सबकुछ करने देता है। यहाँ उदाहरण के साथ

रेपो: https://github.com/sebastiandev/zipper

बीटा पूर्व रिहाई: https://github.com/sebastiandev/zipper/releases/

कोड तरह दिखता है:

Zipper zipper("ziptest.zip"); 
zipper.add("somefile.txt"); 
zipper.add("myFolder"); 
zipper.close();