2012-07-06 8 views
8

मैं क्रॉस-प्लेटफ़ॉर्म एप्लिकेशन के लिए फ़ाइलों को संग्रहीत करने का प्रयास कर रहा हूं, और ऐसा लगता है कि मिनीज़िप (ज़्लिब पर निर्मित) आर्काइवर्स के रूप में पोर्टेबल के बारे में है।मैं मिनीज़िप (ज़्लिब पर) का उपयोग कैसे करूं?

जब मैं निम्नलिखित डमी कोड चलाने का प्रयास है, तथापि, मैं एक प्रणाली त्रुटि मिलती है [my executable] has stopped working. Windows can check online for a solution to the problem.

किसी को भी मदद कर सकते हैं मुझे देखते हैं कि कैसे इस पुस्तकालय उपयोग कैसे करें? — (कोई डॉक्टर या कहीं भी ट्यूटोरियल है कि मैं पा सकते हैं)

zip_fileinfo zfi; 

int main() 
{ 
    zipFile zf = zipOpen("myarch.zip",APPEND_STATUS_ADDINZIP); 
    int ret = zipOpenNewFileInZip(zf, 
     "myfile.txt", 
     &zfi, 
     NULL, 0, 
     NULL, 0, 
     "my comment for this interior file", 
     Z_DEFLATED, 
     Z_NO_COMPRESSION 
     ); 
    zipCloseFileInZip(zf); 
    zipClose(zf, "my comment for exterior file"); 
    return 0; 
} 

चश्मा: Msys + MinGW, विंडोज 7, zlibwapi.dll का उपयोग कर zlib125dll.zip/dll32

उत्तर

16

चूंकि मुझे Google के माध्यम से यह प्रश्न मिला है और इसमें कोई पूर्ण, कार्य कोड नहीं है, मैं यहां कुछ भविष्य के आगंतुकों के लिए उपलब्ध करा रहा हूं।

int CreateZipFile (std::vector<wstring> paths) 
{ 
    zipFile zf = zipOpen(std::string(destinationPath.begin(), destinationPath.end()).c_str(), APPEND_STATUS_CREATE); 
    if (zf == NULL) 
     return 1; 

    bool _return = true; 
    for (size_t i = 0; i < paths.size(); i++) 
    { 
     std::fstream file(paths[i].c_str(), std::ios::binary | std::ios::in); 
     if (file.is_open()) 
     { 
      file.seekg(0, std::ios::end); 
      long size = file.tellg(); 
      file.seekg(0, std::ios::beg); 

      std::vector<char> buffer(size); 
      if (size == 0 || file.read(&buffer[0], size)) 
      { 
       zip_fileinfo zfi = { 0 }; 
       std::wstring fileName = paths[i].substr(paths[i].rfind('\\')+1); 

       if (S_OK == zipOpenNewFileInZip(zf, std::string(fileName.begin(), fileName.end()).c_str(), &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION)) 
       { 
        if (zipWriteInFileInZip(zf, size == 0 ? "" : &buffer[0], size)) 
         _return = false; 

        if (zipCloseFileInZip(zf)) 
         _return = false; 

        file.close(); 
        continue; 
       } 
      } 
      file.close(); 
     } 
     _return = false; 
    } 

    if (zipClose(zf, NULL)) 
     return 3; 

    if (!_return) 
     return 4; 
    return S_OK; 
} 
+0

यह अच्छा है। हालांकि कुछ मुद्दे: 1. यह मानता है कि पूरी फ़ाइल मेमोरी में फिट हो सकती है, जो कुछ हद तक एक सरल दृश्य है, लेकिन शायद इस नमूने के लिए पर्याप्त है। 2. कोई कारण नहीं है कि 0 लंबाई फ़ाइल आउटपुट एक त्रुटि है यदि प्रारंभिक फ़ाइल लंबाई 0 है। 3. मान लें कि यह एक त्रुटि है, टर्नरी ऑपरेशन की कोई आवश्यकता नहीं है। यानी 'अगर (zipWriteInFileInZip (zf, size == 0? "": & buffer [0], आकार)) '' (zipWriteInFileInZip (zf, & buffer [0], आकार) के रूप में लिखा जा सकता है) '। 4. मैं अंडरस्कोर उपसर्ग का उपयोग न करने की सलाह दूंगा। मुझे पता है कि आप इसके बाद लोअरकेस अक्षर का उपयोग कर रहे हैं, लेकिन ... * shrug * – Adrian

+0

आपके द्वारा उठाए गए दूसरे और तीसरे अंक गलत हैं। आकार == 0 चेक यह सुनिश्चित करना है कि बफर [0] शून्य लंबाई पर निष्पादित नहीं किया गया है। यदि कथन में लॉजिकल या ऑपरेशन तब सुनिश्चित करता है कि शून्य फ़ाइल फ़ाइलों को ज़िप फ़ाइल में सही तरीके से लिखा गया है, और बाद में टर्नरी एक बार फिर यह सुनिश्चित करने के लिए कि बफर [0] शून्य लंबाई पर नहीं कहा जाता है। कोड सही ढंग से काम करता है और अपेक्षित के रूप में। – niemiro

+0

इसे सी के रूप में टैग किया गया है, सी ++ नहीं। –

2

से minizip lib अच्छी तरह से है दस्तावेज। विवरण के लिए बस zip.h खोलें।

मैं आपको यहां बता सकता हूं, आप zipOpen के लिए गलत पैरामीटर पारित कर सकते हैं। (एपीपी END_STATUS_ADDINZIP को एक मौजूदा ज़िप फ़ाइल की आवश्यकता है!)

इसके अलावा, कृपया जांचें कि ज़िप ज़िप एक मान्य ज़िपफाइल हैंडल देता है या नहीं।

+0

धन्यवाद। मैंने अपना दूसरा तर्क 'एपीपी END_STATUS_CREATE' में बदल दिया। मुझे zip.h में वैधता का कोई संदर्भ नहीं दिख रहा है; इसके लिए, क्या मुझे सिर्फ यह जांचना चाहिए कि ज़िपफाइल 'न्यूल' है या नहीं? – JellicleCat

+0

इसके अतिरिक्त, क्या आप 'extrafield_local' और' extrafield_global' 'पर कोई प्रकाश डाल सकते हैं? मुझे कोई उदाहरण या पर्याप्त विवरण नहीं मिल रहा है। – JellicleCat

+0

मैंने पहले कभी अतिरिक्तफील्ड_लोकल और extrafield_global का उपयोग नहीं किया था। क्षमा करें मैं मदद नहीं कर सकता। यदि आपके zip.h में कोई दस्तावेज़ नहीं है, तो आप zlib स्रोत कोड डाउनलोड कर सकते हैं। मुझे यकीन है कि उस पैकेज में zip.h में अच्छा प्रलेखन है। – Rango

3

मिनिजिप लाइब्रेरी उदाहरण के साथ आती है; ज़िप करने के लिए minizip.c और मिनीजज़.c अनजिपिंग के लिए। दोनों कमांड लाइन यूटिलिटीज हैं जो लाइब्रेरी का उपयोग कैसे करें। हालांकि वे एक गड़बड़ हैं।

आपको zfi zip_fileinfo भरने की भी आवश्यकता है। कम से कम आपको संरचना को शून्य में प्रारंभ करना चाहिए। zfi में उस फ़ाइल के बारे में जानकारी है जिसे आप zipOpenNewFileInZip का उपयोग करके स्टोर करना चाहते हैं। संरचना में "myfile.txt" की तिथि और विशेषता होनी चाहिए।

मैं निदान ज़िप मुद्दों के लिए PKWARE डेस्कटॉप का उपयोग करने की सलाह देता हूं। यह ज़िप और ज़िप फ़ाइल में फ़ाइलों की संरचना/गुण दिखाता है। जब मैंने myarch.zip खोला तो उसने मुझे बताया कि त्रुटियां थीं। मैंने फ़ाइल गुणों में ड्रिल किया और पाया कि गुण बंद थे।

+1

जांच के लिए धन्यवाद, लेकिन उपरोक्त कोड नमूने में, मुझे निर्दिष्ट किए बिना शून्य में 'zfi' प्रारंभ नहीं किया जाना चाहिए? यह ढेर पर है क्योंकि यह किसी भी समारोह के बाहर है, है ना? – JellicleCat

+0

आह हाँ, आप सही हैं। मैंने यह देखने के लिए कि क्या यह काम करता है, मैंने अभी आपके कोड को फ़ंक्शन में फेंक दिया है। –

+1

आपका कोड ठीक से काम करना चाहिए। मुझे इससे कोई भी विंडोज क्रैश नहीं मिला है। यह डीएलएल का उपयोग करने में एक मुद्दा हो सकता है। क्या आपने zlib लाइब्रेरी में संकलन करने का प्रयास किया है? –

संबंधित मुद्दे