2010-12-01 17 views
5

मेरे पास एक बहुत से छोटी फाइलें हैं जिन्हें मुझे अपने द्वारा बनाए जाने वाले एप्लिकेशन के साथ शिप करने की आवश्यकता है और मैं प्रतिलिपि बनाने और पुनः वितरित करने के लिए इन फ़ाइलों को एक संग्रह में रखना चाहता हूं। मुझे वास्तव में उन्हें एक ही स्थान पर रखने का विचार भी पसंद है, इसलिए मुझे कुछ गलत होने पर केवल एक फ़ाइल के md5 की तुलना करने की आवश्यकता है।सी ++ फ़ाइल कंटेनर (उदा। ज़िप)

मैं एक कक्षा के बारे में सोच रहा हूं जो संग्रह को लोड कर सकता है और संग्रह के भीतर फ़ाइलों की एक सूची वापस कर सकता है और अगर मुझे इसे एक्सेस करने की आवश्यकता है तो फ़ाइल को स्मृति में लोड करें।

मैंने पहले से ही जो कुछ हासिल करना है उसे प्राप्त करने के विभिन्न तरीकों के लिए इंटरनेट की खोज की है और zlib और lzma sdk के बारे में पता चला है। दोनों ने वास्तव में मुझसे अपील नहीं की क्योंकि मुझे वास्तव में पता नहीं चला कि पोर्टेबल ज़्लिब कैसे है और मुझे lzma sdk पसंद नहीं आया क्योंकि यह बहुत अधिक है और मैं इस वजह से एप्लिकेशन को उड़ाना नहीं चाहता मुसीबत। ज़्लिब के साथ एक और नकारात्मकता यह है कि मैन्युअल में समझाया गया सब कुछ पाने के लिए मेरे पास सी/सी ++ अनुभव नहीं है (मैं वास्तव में सी ++ के लिए नया हूं)।

मुझे यह भी जोड़ना होगा कि यह एक समय की गंभीर समस्या है। हालांकि मैं एक साधारण प्रारूप को लागू करने के बारे में कुछ समय देता हूं जैसे कि मैं अपने आवेदन के भीतर फ़ाइलों तक आसानी से पहुंच सकता हूं लेकिन मुझे अभी तक ऐसा करने का समय नहीं मिला।

तो जो मैं खोज रहा हूं वह एक पुस्तकालय है जो मुझे एक संग्रह के भीतर फ़ाइलों तक पहुंचने की अनुमति देता है। मुझे खुशी होगी अगर कोई मुझे सही दिशा में इंगित कर सकता है।

अग्रिम धन्यवाद, रॉबिन।

संपादित करें: मुझे लिनक्स और विंडोज़ के नीचे पहुंचने के लिए संग्रह की आवश्यकता है। क्षमा करें मैंने शुरुआत में इसका उल्लेख नहीं किया था।

उत्तर

2

उत्तर इस बात पर निर्भर करता है कि संग्रह शुरू होने के बाद आप कोड के माध्यम से संग्रह को संशोधित करने की योजना बना रहे हैं या नहीं।

यदि आपको इसे संशोधित करने की आवश्यकता नहीं है, तो आप टीएआर का उपयोग कर सकते हैं - यह एक आसान और सरल प्रारूप है। अगर आप संपीड़न चाहते हैं, तो आप tar.gz रीडर को कार्यान्वित कर सकते हैं या कुछ पुस्तकालय ढूंढ सकते हैं जो ऐसा करता है (मुझे विश्वास है कि खुले स्रोत वाले कुछ भी उपलब्ध हैं)।

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

+2

अच्छी ज़िप पर्याप्त होगा लेकिन मैंने वीएफएस शब्द को बिल्कुल नहीं देखा। मैंने भौतिकीएफएस पाया और मुझे लगता है कि मैं अपनी परियोजना के लिए बिल्कुल उपयोग कर रहा हूं। आपके उत्तर के लिए बहुत बहुत धन्यवाद। – Robin

2

zlib अत्यधिक पोर्टेबल और बहुत व्यापक रूप से उपयोग किया जाता है। यदि आप सी ++ इंटरफ़ेस को समझ नहीं सकते हैं, तो कई अन्य भाषाओं के विकल्प हैं - 'संबंधित बाहरी लिंक' here देखें।

कुछ अलग खोज करने से पहले एक और नज़र डालें।

+1

लेकिन 'zlib' ऐसा नहीं करता जो ओपी चाहता है जो संग्रहित हो। यह संपीड़न करता है, लेकिन यह स्वयं द्वारा .zip फ़ाइल प्रारूप को समझ नहीं सकता है। –

+0

हां, संपीड़न केवल दूसरे पर आवश्यक है, हालांकि मुझे मुख्य रूप से आवश्यकता है कि सैकड़ों छोटी फ़ाइलों को एक फ़ाइल में समूहित किया जाए। – Robin

2

यदि आप क्यूटी या विंडोज का उपयोग कर रहे हैं तो आप निष्पादन योग्य संसाधन क्षेत्र में डेटा भी पैक कर सकते हैं। आपको केवल इस तकनीक का उपयोग करके निष्पादन योग्य फ़ाइल वितरित करना होगा। उस डेटा तक पहुंचने के लिए पहले से ही लिखा और परीक्षण किया गया एक अच्छी तरह से परिभाषित एपीआई है।

3

ज़िप के लिए, मैं हमेशा ZipUtils पर आंशिक रहा हूं, जो प्रक्रिया को आसान बनाता है और zlib और info-zip पुस्तकालयों के शीर्ष पर बनाया गया है।

+0

लिंक साथी के लिए धन्यवाद लेकिन मुझे विंडोज़ और लिनक्स पर चलाने की आवश्यकता है। ZipUtils केवल विंडोज़ पर काम करता है। – Robin

+0

@ रोबिन: क्या आप इसे अपने प्रश्न में डाल सकते हैं, कृपया? :) धन्यवाद! –

0

zlib API जाने का तरीका है। सरल और पोर्टेबल। एपीआई के लिए unzip.h शीर्षलेख देखें जो संग्रह फ़ाइलों तक पहुंचता है। यह सी में है और बहुत आसान है।

यदि फ़ाइलें छोटी हैं, तो आप उन्हें स्ट्रिंग अक्षर (डिन 2 एच उपयोगिता के लिए खोज) में डंप कर सकते हैं और अपनी प्रोजेक्ट में शामिल कर सकते हैं। फिर फ़ाइलों को पढ़ने वाले कोड को बदलें। अगर सभी फाइलें वर्तमान में ifstream क्लास का उपयोग कर पढ़ी जाती हैं, तो इसे बस इटिंगिंगस्ट्रीम क्लास में बदलकर कोड को दोबारा सम्मिलित करें।

0

Quazip का उपयोग करने का प्रयास करें - यह उपयोग करने में काफी आसान है। आप इसे एक स्ट्रीम के रूप में उपयोग कर सकते हैं जिससे आप फ्लाई पर संपीड़ित फ़ाइल पढ़ते हैं।

+0

सुझाव के लिए धन्यवाद लेकिन मैं क्यूटी निर्भरताओं के साथ एक कंसोल अनुप्रयोग bloat नहीं करना चाहता। – Robin

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