
क्यों लिखते हैं?
- क्योंकि आपका अपना कस्टम टूल होना सुविधाजनक है जहाँ आप किसी भी स्तर पर संग्रह करने में हस्तक्षेप कर सकते हैं
- क्योंकि यह दिलचस्प है
- क्योंकि कई अभिलेखागार में एपीआई, भुगतान किया गया है, और दूसरों के लिए, पहला तर्क देखें।
प्रौद्योगिकी और पुस्तकालय
आपको
zlib.net.dll लाइब्रेरी (
आधिकारिक साइट ) की
आवश्यकता होगी।
विजुअल स्टूडियो 2010 डेवलपमेंट एनवायरनमेंट
सी # भाषा
ढाँचा 3.5
संदर्भ की शर्तें
अभिलेखागार में सक्षम होना चाहिए:
- फ़ाइलों और निर्देशिकाओं को संपीड़ित करें
- सम्पीडन के बिना संग्रह संकलित करें
- एन्क्रिप्ट डेटा (संपीड़न के साथ और बिना)
- निर्दिष्ट पथों को बाहर करें
- फ़ाइलों को संपीड़ित होने के बाद हटाएं
- संकुचित संग्रह अनपैक करें
डिज़ाइन
पुरालेख प्रारूप
अनुकूलन के माध्यम से, मैं निम्नलिखित विकल्प पर आया:
नियुक्ति | आकार |
पुरालेख प्रकार | 1 बाइट |
हैडर की लंबाई (संपीड़न और एन्क्रिप्शन के बाद) | 4 बाइट्स |
शीर्षक (हम नीचे और अधिक विस्तार से विचार करेंगे) | एन बाइट्स |
पहली फाइल का कंटेंट ब्लॉक | एन बाइट्स |
दूसरी फ़ाइल का कंटेंट ब्लॉक | एन बाइट्स |
...... | ...... |
Kth फ़ाइल की सामग्री ब्लॉक | एन बाइट्स |
पुरालेख हैडर प्रारूप
नियुक्ति | आकार |
कच्चा हैडर आकार | 4 बाइट्स |
ब्लॉक 1 | एन बाइट्स |
ब्लॉक 2 | एन बाइट्स |
...... | ...... |
ब्लॉक के | एन बाइट्स |
पुरालेख हैडर ब्लॉक प्रारूप
नियुक्ति | आकार |
ब्लॉक आकार | 4 बाइट्स |
पूर्ण पथ लंबाई | 4 बाइट्स |
पूर्ण मार्ग | एन बाइट्स |
सापेक्ष पथ लंबाई | 4 बाइट्स |
सापेक्ष पथ | एन बाइट्स |
प्रसंस्करण के बाद वस्तु का आकार | 8 बाइट्स |
थोड़ा स्पष्टीकरण। संग्रह फ़ाइल की शुरुआत में, एक हेडर संग्रहीत किया जाता है जो संग्रह वस्तुओं के लिए सभी मेटाडेटा एकत्र करता है। शीर्ष लेख स्वयं उसी संपीड़न और एन्क्रिप्शन चरणों के माध्यम से जाता है जो संग्रह फ़ाइलों के रूप में होता है। हेडर प्रसंस्करण के बाद फाइलों की सामग्री को संग्रहीत करने वाले ब्लॉक के बाद, ब्लॉक सही निशान तक जाते हैं। ब्लॉक सीमाओं की परिभाषा हेडर से अनुसरण करती है, जिसमें ब्लॉक के आकार संग्रहीत होते हैं।
काम के सामान्य सिद्धांत
उपयोगकर्ता संपीड़न विकल्प सेट करता है, जिसके आधार पर आवश्यक फ़ाइल हैंडलर (आर्काइवर, एनकोडर) जुड़े हुए हैं, ऐसे प्रत्येक हैंडलर में दो विधियाँ होती हैं, Execute और BackExecute। संग्रह करते समय, हम Execute पद्धति को कॉल करते हैं, जब BackExecute विधि को अनज़िप करते हैं, और अनज़िप करने पर हम रिवर्स ऑर्डर में हैंडलर का उपयोग करते हैं। यह संरचना किसी भी संख्या में नए हैंडलर (उदाहरण के लिए, अन्य एन्क्रिप्शन या संपीड़न विधियों को लागू करने) के साथ कार्यक्रम को पूरक करने के लिए बेहद आसान बनाती है।
कार्य एल्गोरिथ्म
- पुरालेख प्रकार का पता लगाने (संकुचित, एन्क्रिप्टेड)
- संग्रह की वस्तुओं की एक सूची पढ़ना
- पठन सूची और बहिष्करण सूची के आधार पर संग्रहीत वस्तुओं की एक पूरी सूची का गठन
- संग्रह शीर्ष लेख बनाएं (ऑब्जेक्ट दृश्य में)
- हेडर में ऑब्जेक्ट्स की पूरी सूची पर इरेटिंग
- ऑब्जेक्ट को संसाधित करना, हेडर में प्रसंस्करण के बाद इसके आकार पर डेटा को अपडेट करना, संसाधित सामग्री की अस्थायी फ़ाइल को लिखना।
- फ़ाइल करने के लिए सहेजा जा रहा हैडर
- हैडर प्रसंस्करण (संपीड़न, एन्क्रिप्शन)
- परिणामी संग्रह फ़ाइल बनाएँ
कार्यान्वयन
ZLib बाइट्स के एक सरणी के रूप में स्थानांतरित किए गए डेटा को संपीड़ित / विघटित कर सकता है। वास्तव में यह वह सब है जिसकी हमें आवश्यकता है और जो हम उपयोग करेंगे। वह डेटा को एन्क्रिप्ट करना नहीं जानता है, इसके लिए हम मानक .NET फ्रेमवर्क लाइब्रेरी - System.Security.Cryptography का उपयोग करते हैं।
संग्रह / अनज़िप करने की प्रक्रिया में, आप संसाधित की जा रही वर्तमान वस्तु पर डेटा प्राप्त कर सकते हैं, साथ ही त्रुटियां भी हो सकती हैं।
यदि फ़ाइल को संसाधित करते समय कोई त्रुटि होती है, तो उपयोगकर्ता को 4 क्रियाओं का विकल्प दिया जाता है:
- बीच में बंद करें
- त्रुटि को नजरअंदाज करें
- सभी त्रुटियों को अनदेखा करें
- दोहराना
केवल एप्रोप्रोसेसिंग ईवेंट के बारे में टिप्पणी करने से एक्शन रिक्वेस्ट को रद्द किया जा सकता है, जिस स्थिति में प्रोग्राम बाधित होगा।
मैं प्रोग्राम कोड नहीं दूंगा, मैं सूत्रों का लिंक देता हूं।
सीधे:
परियोजनाDll'ki के रूप मेंSVN:
svn: //svn.code.sf.net/p/yark/code-0/trunk
परियोजना:
sourceforge.net/projects/yarkऔर उपयोग का एक उदाहरण:
दबाव
ArchiveProvider compressor = new ArchiveProvider(); using (SaveFileDialog sfd = new SaveFileDialog()) { if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { CompressorOption option = new CompressorOption() { Password = __, WithoutCompress = true___, RemoveSource = true____, Output = sfd.FileName };
विसंपीड़न
ArchiveProvider decompressor = new ArchiveProvider(); using (FolderBrowserDialog fbd = new FolderBrowserDialog()) { if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { decompressor.Decompress(__, fbd.SelectedPath, __); } }
काम के परिणाम की तुलना
समय में, परिणाम का पता लगाना शुरू नहीं हुआ, लगभग समान।
स्रोत डेटा:
- पाठ फ़ाइलों के साथ निर्देशिका (1 430 Kb)
- मिश्रित डेटा कैटलॉग (1889 Kb)
| टेक्स्ट | मिश्रित डेटा |
WinRar | 613 | 8 045 |
ज़िप | 638 | 9० ९ |
यह एक | 588 | ६५५ |
रार और ज़िप प्रारूप के लिए, सामान्य संपीड़न पैरामीटर सेट किया गया था, जिसका उपयोग कार्यक्रम में भी किया जाता है।
वर्तमान संग्रह प्रारूप फ़ाइलों और निर्देशिकाओं के निरपेक्ष पथों को संग्रहीत करता है, आप उन्हें बाहर कर सकते हैं और संपीड़न में थोड़ा सुधार कर सकते हैं।
संभव सुधार
- फ़ाइल के बारे में जानकारी की बचत (निर्माण / परिवर्तन, अभिगम अधिकार)
- मल्टीथ्रेडिंग जोड़ें (अस्थायी फ़ाइलों के निर्माण को समानांतर करें)
- संग्रह में टिप्पणी जोड़ें
- प्रोग्राम के साथ फ़ाइलें संबद्ध करें