.NET में ZLib- आधारित Archiver लिखना


क्यों लिखते हैं?




प्रौद्योगिकी और पुस्तकालय


आपको zlib.net.dll लाइब्रेरी ( आधिकारिक साइट ) की आवश्यकता होगी।
विजुअल स्टूडियो 2010 डेवलपमेंट एनवायरनमेंट
सी # भाषा
ढाँचा 3.5

संदर्भ की शर्तें


अभिलेखागार में सक्षम होना चाहिए:


डिज़ाइन


पुरालेख प्रारूप

अनुकूलन के माध्यम से, मैं निम्नलिखित विकल्प पर आया:
नियुक्ति
आकार
पुरालेख प्रकार1 बाइट
हैडर की लंबाई (संपीड़न और एन्क्रिप्शन के बाद)4 बाइट्स
शीर्षक (हम नीचे और अधिक विस्तार से विचार करेंगे)एन बाइट्स
पहली फाइल का कंटेंट ब्लॉकएन बाइट्स
दूसरी फ़ाइल का कंटेंट ब्लॉकएन बाइट्स
............
Kth फ़ाइल की सामग्री ब्लॉकएन बाइट्स

पुरालेख हैडर प्रारूप
नियुक्ति
आकार
कच्चा हैडर आकार4 बाइट्स
ब्लॉक 1एन बाइट्स
ब्लॉक 2एन बाइट्स
............
ब्लॉक केएन बाइट्स

पुरालेख हैडर ब्लॉक प्रारूप
नियुक्ति
आकार
ब्लॉक आकार4 बाइट्स
पूर्ण पथ लंबाई4 बाइट्स
पूर्ण मार्गएन बाइट्स
सापेक्ष पथ लंबाई4 बाइट्स
सापेक्ष पथएन बाइट्स
प्रसंस्करण के बाद वस्तु का आकार8 बाइट्स


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

काम के सामान्य सिद्धांत


उपयोगकर्ता संपीड़न विकल्प सेट करता है, जिसके आधार पर आवश्यक फ़ाइल हैंडलर (आर्काइवर, एनकोडर) जुड़े हुए हैं, ऐसे प्रत्येक हैंडलर में दो विधियाँ होती हैं, Execute और BackExecute। संग्रह करते समय, हम Execute पद्धति को कॉल करते हैं, जब BackExecute विधि को अनज़िप करते हैं, और अनज़िप करने पर हम रिवर्स ऑर्डर में हैंडलर का उपयोग करते हैं। यह संरचना किसी भी संख्या में नए हैंडलर (उदाहरण के लिए, अन्य एन्क्रिप्शन या संपीड़न विधियों को लागू करने) के साथ कार्यक्रम को पूरक करने के लिए बेहद आसान बनाती है।

कार्य एल्गोरिथ्म


  1. पुरालेख प्रकार का पता लगाने (संकुचित, एन्क्रिप्टेड)
  2. संग्रह की वस्तुओं की एक सूची पढ़ना
  3. पठन सूची और बहिष्करण सूची के आधार पर संग्रहीत वस्तुओं की एक पूरी सूची का गठन
  4. संग्रह शीर्ष लेख बनाएं (ऑब्जेक्ट दृश्य में)
  5. हेडर में ऑब्जेक्ट्स की पूरी सूची पर इरेटिंग
  6. ऑब्जेक्ट को संसाधित करना, हेडर में प्रसंस्करण के बाद इसके आकार पर डेटा को अपडेट करना, संसाधित सामग्री की अस्थायी फ़ाइल को लिखना।
  7. फ़ाइल करने के लिए सहेजा जा रहा हैडर
  8. हैडर प्रसंस्करण (संपीड़न, एन्क्रिप्शन)
  9. परिणामी संग्रह फ़ाइल बनाएँ


कार्यान्वयन


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 }; //      foreach (string line in lbIncludes.Items) option.IncludePath.Add(line); //      foreach (string line in lbExclude.Items) option.ExcludePath.Add(line); compressor.Compress(option); } } 

विसंपीड़न

 ArchiveProvider decompressor = new ArchiveProvider(); using (FolderBrowserDialog fbd = new FolderBrowserDialog()) { if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { decompressor.Decompress(__, fbd.SelectedPath, __); } } 


काम के परिणाम की तुलना


समय में, परिणाम का पता लगाना शुरू नहीं हुआ, लगभग समान।
स्रोत डेटा:


टेक्स्ट
मिश्रित डेटा
WinRar
6138 045
ज़िप
6389० ९
यह एक
588६५५


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

संभव सुधार


Source: https://habr.com/ru/post/In133379/


All Articles