2009-07-21 13 views
6

पर स्ट्रीमिंग संग्रह से फ़ाइलों का डिक्रप्रेशन और निष्कर्षण मैं एक ब्राउजर प्लगइन लिख रहा हूं, फ्लैश और जावा के समान है कि यह फ़ाइल (.jar या .swf) को डाउनलोड होने के तुरंत बाद डाउनलोड करना शुरू कर देता है। जब तक पूरी जार फ़ाइलों को लोड नहीं किया जाता है तब तक जावा प्रतीक्षा करता है (मुझे विश्वास है), लेकिन फ़्लैश नहीं है। मुझे वही क्षमता चाहिए, लेकिन संपीड़ित संग्रह फ़ाइल के साथ। जैसे ही उनके डिकंप्रेशन के लिए आवश्यक बाइट्स को डाउनलोड किया जाता है, मैं संग्रह में फ़ाइलों तक पहुंच बनाना चाहता हूं।फ्लाई

उदाहरण के लिए मैं एक स्मृति बफर में संग्रह को डाउनलोड कर रहा हूँ, और जैसे ही पहले फ़ाइल को संपीड़ित करने के लिए संभव है, मैं इसे संपीड़ित (यह भी एक स्मृति बफर करने के लिए) सक्षम होना चाहते हैं।

क्या कोई प्रारूप/पुस्तकालय इसका समर्थन करता है?

संपादित करें: यदि संभव हो, तो मैं संपीड़न और संग्रहण के लिए अलग-अलग लोगों के बजाय एक फ़ाइल प्रारूप पसंद करूंगा, जैसे gz/bzip2 और tar।

+0

में पाया जा सकता है कि आपको कौन सा समाधान मिला है? –

उत्तर

6

2 मुद्दों यहाँ

  1. कैसे कोड लिखने के लिए कर रहे हैं।

  2. उपयोग करने के लिए किस प्रारूप का उपयोग करें।

फ़ाइल प्रारूप पर, आप .ZIP प्रारूप का उपयोग नहीं कर सकते क्योंकि .ZIP फ़ाइल के अंत में सामग्री की तालिका रखता है। इसका मतलब है कि आपको यह जानने से पहले पूरी फाइल डाउनलोड करनी होगी कि इसमें क्या है। ज़िप में हेडर हैं जिनके लिए आप स्कैन कर सकते हैं लेकिन वे शीर्षलेख फ़ाइल में मौजूद चीज़ों की आधिकारिक सूची नहीं हैं।

ज़िप स्पष्ट रूप से अंत में सामग्री की तालिका डालता है क्योंकि यह तेजी से फ़ाइलों को जोड़ने की अनुमति देता है।

मान लें कि आपके पास एक ज़िप फ़ाइल है जिसमें फाइल 'ए', 'बी', और 'सी' है। आप 'सी' अपडेट करना चाहते हैं। सामग्री की तालिका को पढ़ने के लिए ज़िप में यह पूरी तरह मान्य है, नई सी संलग्न करें, नई 'सी' पर इंगित सामग्री की एक नई तालिका लिखें लेकिन पुरानी 'सी' अभी भी फाइल में है। यदि आप शीर्षलेखों के लिए स्कैन करते हैं तो आप पुराने 'सी' को देखकर समाप्त हो जाएंगे क्योंकि यह अभी भी फ़ाइल में है।

जोड़कर की यह सुविधा जिप की एक स्पष्ट डिजाइन लक्ष्य था। यह 1 9 80 के दशक से आता है जब एक ज़िप कई फ्लॉपी डिस्क फैल सकता है। यदि आपको फ़ाइल जोड़ने की आवश्यकता है तो यह पूरी ज़िप फ़ाइल को फिर से लिखने के लिए सभी एन डिस्क को पढ़ने के लिए चूसना होगा। तो इसके बजाय प्रारूप आपको अद्यतन फ़ाइलों को अंत में जोड़ने देता है जिसका अर्थ है कि इसे केवल अंतिम डिस्क की आवश्यकता है। यह सिर्फ पुराने टीओसी पढ़ता है, नई फाइलों को जोड़ता है, एक नया टीओसी लिखता है।

Gzipped टार फाइल को इस समस्या नहीं है।तार फ़ाइलों को हेडर, फ़ाइल, हेडर फ़ाइल संग्रहीत किया जाता है, और संपीड़न उस के शीर्ष पर होता है, इसलिए फ़ाइल डाउनलोड होने के बाद इसे डिकंप्रेस करना संभव होता है और फ़ाइलों को उपलब्ध होने के रूप में उपयोग करना संभव होता है। आप Winrar (वाणिज्यिक) या 7-ज़िप (फ्री) और लिनक्स, ओएसएक्स और सिगविन पर टैर कमांड का उपयोग कर विंडोज़ में आसानी से gzipped tar फ़ाइलों को बना सकते हैं।

कोड लिखने के लिए पर,

O3D यह करता है और खुला स्रोत है ताकि आप कोड http://o3d.googlecode.com

विसंपीड़न कोड में O3D/आयात/पार है देख सकते हैं/...

यह कुछ गोंद का उपयोग करके एनपीएपीआई को लक्षित करता है जो ओ 3 डी/प्लगइन/क्रॉस

2

निश्चित रूप से, zlib उदाहरण के लिए z_stream का उपयोग वृद्धिशील संपीड़न और कार्यों के माध्यम से डिकंप्रेशन के लिए करता है इंटिट, फुफ्फुस, डिफ्लेटइनिट, डिफ्लेट। libzip2 की समान क्षमताएं हैं।

संग्रह से वृद्धिशील निष्कर्षण के लिए (जैसा कि यह डिफ्लेटेड हो जाता है), उदाहरण के लिए देखें अच्छे पुराने tar प्रारूप में।

5

boost::zlib filters देखें। वे zlib एक स्नैप का उपयोग करते हैं।

यहाँ बढ़ावा डॉक्स कि कंसोल के लिए एक फ़ाइल को संपीड़ित और यह लिखेंगे से नमूना है:

#include <fstream> 
#include <iostream> 
#include <boost/iostreams/filtering_streambuf.hpp> 
#include <boost/iostreams/copy.hpp> 
#include <boost/iostreams/filter/zlib.hpp> 

int main() 
{ 
    using namespace std; 

    ifstream file("hello.z", ios_base::in | ios_base::binary); 
    filtering_streambuf<input> in; 
    in.push(zlib_decompressor()); 
    in.push(file); 
    boost::iostreams::copy(in, cout); 
} 
संबंधित मुद्दे