একটি .zip এ দুটি অভিন্ন ফাইল স্থাপন করার সময়, তারা 2x স্পেস নেয়, এটি এড়ানো যায়


8

বলুন যে আপনার কাছে একটি ফাইল রয়েছে যা আপনি একটি .zip সংরক্ষণাগার রাখতে চান:

zip a1.zip foo.dll

আমার পরীক্ষা .dll ফাইলটি 10MB ডলার এবং সংরক্ষণাগারটি 3.5MB হিসাবে দেখা যায়

তারপরে আপনি ঠিক একই বিষয়বস্তু সহ একটি ফাইল তৈরি করুন এবং এগুলিকে একটি সংরক্ষণাগারে রেখেছেন:

cp foo.dll bar.dll
zip a2.zip foo.dll bar.dll

আপনি আশা করতে পারেন যে জিপটি এই তথ্যটি পুনরাবৃত্তি করার জন্য যথেষ্ট স্মার্ট, এবং .zip এর অভ্যন্তরে কেবল একটি সংকোচনের বস্তু ব্যবহার করে, তবে এটি এমন নয়: a2.zip 7.0MB!

মূলত এ জাতীয় বেশিরভাগ ইউটিলিটিগুলি একইরকম আচরণ করে (তার্ড.জেড, টর.বিজে ২, রোল সলিড মোডে) - কেবল z জিপ আমাকে ধরেছে এবং ফলস্বরূপ a2.7z কেবলমাত্র a1.7z এর চেয়ে সামান্য আকারে বড়।

সুতরাং প্রশ্নটি হল: এই স্থানের অপচয়জন এড়ানো যায় এমন একটি .zip ফাইল তৈরি করা কি সম্ভব ? আমরা সি ++ কোড দিয়ে .zip ফাইল তৈরি করি, যা zlib থেকে মিনিজিপ প্রকল্প ব্যবহার করে।


আমাদের কেন এটা দরকার?

আমরা আমাদের সফ্টওয়্যারটিকে ".Exe ইনস্টলার" এবং ".zip ফাইল" উভয় ফর্মে চালিত করি। সফ্টওয়্যারটির সত্যই ইনস্টলেশন প্রয়োজন হয় না, আপনি কেবল আনজিপ করে এটি ব্যবহার করতে পারেন। .Zip বিকল্পটি বড় ক্লায়েন্টদের দ্বারা পছন্দ করা হয় যার অনেকগুলি ওয়ার্কস্টেশন রয়েছে এবং স্বয়ংক্রিয় স্থাপনা / সফ্টওয়্যার আপডেট পরিষেবা ব্যবহার করে।

আমরা সম্প্রতি তিনটি .dll ফাইল প্রবর্তন করেছি, এখন দুটি ভিন্ন ফোল্ডারে রাখতে হবে, বিভিন্ন উপাদান ব্যবহার করতে হবে (প্রযুক্তিগত কারণে এই ফাইলগুলির জন্য কেবল একটি কেন্দ্রীয় ডিরেক্টরি অসম্ভব)। এই তিনটি .dll ফাইল হ'ল উভয় ফোল্ডারে হুবহু অনুলিপি। .Exe ইনস্টলারটি এটিকে চিত্রিত করে, যেহেতু আমরা এটিকে দুটি গন্তব্যের প্রতিটিটির জন্য ঠিক একই সংকোচিত ব্লব ব্যবহার করার নির্দেশ দিই। তবে এটি জিপ-এর ক্ষেত্রে নয় এবং ফলস্বরূপ ইনস্টলটি 15MB বৃহত্তর, যার অর্থ আরও বেশি ব্যান্ডউইথের ব্যবহার, ধীর ডাউনলোডের সময় এবং সিয়ারিং ইঞ্জিনিয়ার-অসন্তুষ্ট-যে-জিনিসগুলি-অনুকূল-ইস্যু নয় type এছাড়াও, .zip ইনস্টল হঠাৎ করে .exe ইনস্টলের চেয়ে বড় হয়ে যায়, তাই আমাদের জিজ্ঞাসা করা হবে আমরা .exe ইনস্টলটিতে কী বাদ দিয়েছি।

এর কিছু সম্ভাব্য সমাধান রয়েছে,

  • --জিপ ব্যবহার করুন : তবে মনিব এর পক্ষে দৃ strongly়রূপে, কারণ এটি উল্লিখিত স্বয়ংক্রিয় মোতায়েনকারী লোকদের তাদের স্ক্রিপ্টগুলিকে--জিপের জন্য সংশোধন করতে বাধ্য করে।
  • সিমলিংকগুলি ব্যবহার করুন : আপনি যদি একটি .zip এর ভিতরে একটি সিমলিংক রাখেন, যা .zip এর ভিতরে অন্য কোনও ফাইলকে নির্দেশ করে, এটি রেফারেন্স হিসাবে সংরক্ষণ করা হয় (যেমন --symlinksবিকল্পটি ব্যবহার করে zip)। আশা করা যায়, উইন 32 এর অধীনে অপরিবর্তনকারীরা এগুলি সমর্থন করার জন্য যথেষ্ট হবে এবং ফাইলটির একটি অনুলিপি যেখানে সিমলিংকটি অবস্থিত হওয়া উচিত সেখানে নিয়ে যাবে ract Fe WinRAR এটি করে, তবে প্রচুর প্রোগ্রাম রয়েছে যা ".zip করতে পারে" এবং আমি নিশ্চিত নই যে এটি সমস্ত এইভাবে করে কিনা।

1
সুতরাং, আপনি এই সমাধান কিভাবে?
রবার্ট পোলাক

1
আমরা করিনি। আমি আর সেই সংস্থায় আছি না, তবে এএপিকের জিপসের সাথে স্থানটি এখনও নষ্ট।
এনিরিফ

উত্তর:


1

আপনি দুটি ফাইলকে একটি সঙ্কোচিত জিপ ফাইলে রাখতে পারেন (উদাঃ 7-জিপ সহ), তারপরে ফলাফলটি পুনরায় একটি জিপ ফাইলে রেখে দিন।


সম্ভবত ব্যবহারকারীদের দুবার আনজিপ আনতে বিরক্ত করা, তবে ঝরঝরে কৌশল!
ম্যাথিয়াস

0

আপনি একটি ছোট আন-সংরক্ষণাগার মডিউল লিখে আপনার সমস্যা সমাধান করতে পারেন। আপনি হয় এই অন-অর্চিভারটি ব্যবহারকারীদের মধ্যে বিতরণ করতে পারেন, তাই তারা জিপটি বের করার জন্য এটি ব্যবহার করে, বা আরও ভাল, আপনার .EXE প্রোগ্রামের অংশ হিসাবে মডিউলটি বাস্তবায়ন করে। মডিউলটি এরকম কিছু সহ সি # কনসোল প্রোগ্রাম হতে পারে:

        private static void Extract(string filename)
        {
            //ZipInputStream zi = new ZipInputStream (File.Open ("", FileMode.Open));
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(filename))) {

                ZipEntry theEntry=null;
                while ((theEntry = s.GetNextEntry()) != null) 
                {

                    Console.WriteLine(theEntry.Name);

                    string directoryName = Path.GetDirectoryName(basedir + "ext" + Path.DirectorySeparatorChar + theEntry.Name);
                    string fileName = Path.GetFileName(basedir + "ext" + Path.DirectorySeparatorChar  + theEntry.Name);
                    Console.WriteLine("And the path is:" + basedir +  "ext" + Path.DirectorySeparatorChar  + theEntry.Name);

// create directory
                    if ( directoryName.Length > 0 ) {
                        //Console.WriteLine("DIRECTORY IS SOMETHING");
                        Directory.CreateDirectory(directoryName);
                    }

                    if (fileName != String.Empty) {
                        using (FileStream streamWriter = File.Create(basedir+"DLL_PATH" + Path.DirectorySeparatorChar  + theEntry.Name)) {

                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true) {
                                size = s.Read(data, 0, data.Length);
                                if (size > 0) {
                                    streamWriter.Write(data, 0, size);
                                } else {
                                    break;
                                }
                            }
                        }
                    }
                }
                  System.IO.File.Copy("source.dll", "destination.dll"); //IMPORTANT

            }

        }

এটি পরীক্ষিত নয়, তবে আমি নিশ্চিত যে আপনি এটির সাথে কাজ করতে পারবেন। সর্বাধিক গুরুত্বপূর্ণ অংশটি হ'ল আপনি যেখানে এক্সট্রাক্ট করা ফাইলটি নতুন dll তে অনুলিপি করছেন:

System.IO.File.Copy("source.dll", "destination.dll"); //IMPORTANT

নিশ্চিত হয়ে নিন যে আপনি এটির সাথে ওপেনসোর্স শার্পজাইপলিব ডিএলএল অন্তর্ভুক্ত করেছেন এবং এগুলি ব্যবহৃত নামস্থান:

using System;
using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Xml;

এটি সর্বদা কার্যকর নাও হতে পারে। ধরে নিন (সরলতার জন্য), আমাদের .zip এ foo / এবং বার / কেবল দুটি ডিরেক্টরি রয়েছে। প্রতিটি ডিরেক্টরিতে একটি .exe থাকে (বলুন, foo / a.exe এবং বার / বি.এক্সি), এর প্রত্যেকটির জন্য এটি প্রয়োজন .dll (সুতরাং আমরা foo / baz.dll এবং বার / baz.dll শিপ করব)। এখন ধরে নিন আমরা কেবল এই ডিএলকে foo / এ রেখেছি এবং এএক্সে এটির বার / এ স্বয়ংক্রিয় অনুলিপি তৈরি করি। আপনি সরাসরি বার / বি.এক্সি চালাতে পারবেন না, কারণ এটি "ডিএলএল অনুপস্থিত" বলে চিৎকার করবে। কিছু ব্যবহারকারীর জন্য কেবল বার / বি.এক্স.ই প্রয়োজন হতে পারে, সুতরাং তাদেরকে "আরে, বি.এক্স.ই. চালানোর আগে একবার a.exe চালানো" বলাই একটি অদ্ভুত পদক্ষেপ হবে, কেবল তাদের হাতে .dll অনুলিপি করার নির্দেশ দেওয়ার চেয়ে আলাদা নয় different
অ্যানারিফ

@ অ্যানরিফ - বার / ডিরেক্টরিতে baz.dll অটো-অনুলিপি করার পরিবর্তে আপনি কেন এটি একটি সাধারণ ডিরেক্টরিতে (যেমন সি: \ উইন্ডোজ) অনুলিপি করেন না এবং শেলটি নিবন্ধকরণ ইউটিলিটিটি (NET DLL এর ক্ষেত্রে পুনরায় ব্যবহার করতে চান) , অ্যাক্টিভ এক্স ডিএলএল ক্ষেত্রে regsvr32) এটি রেজিস্টার করতে। তারপরে, আপনার .exes উভয়ই সূক্ষ্মভাবে কাজ করবে।
প্রহ্লাদ ইয়েরি

মূল প্রশ্নে উল্লিখিত হিসাবে, প্রযুক্তিগত কারণে আমরা তা করতে পারি না।
6

0

আমি দুটি বিকল্প প্রস্তাব করছি:

  • একটি স্ব-উত্তোলন বিতরণ করুন .exe(কোনও ইনস্টলার নয়), যা একটি ডিরেক্টরি তৈরি করে যেখানে সমস্ত ফাইল সঠিক আপেক্ষিক জায়গায় থাকে (তারপরে ক্লায়েন্টকে কেবল যেখানে ইচ্ছা সেখানে ডিরেক্টরিটি টেনে নিয়ে যেতে হবে)। আপনি যদি আরও ছোট স্থানের সুবিধা পাবেন তা তৈরি করতে আপনি 7 জিপ ব্যবহার করেন, তদুপরি লোকেরা যদি এটি ইনস্টল করে থাকে তবে এটি 7zip নিজেই একটি সংরক্ষণাগার হিসাবে খোলার সুযোগ রয়েছে।
  • সরলতা আলিঙ্গন এবং .zipনকল ফাইল সহ সমতল সঙ্গে থাকুন । ব্যান্ডউইদথ কি এতো সমস্যা? প্রত্যাশার মতো স্টাফ নিয়ে কাজ না করা / জটিল ইনস্টল পদ্ধতি সম্পাদন করতে না পারার বিষয়ে অভিযোগকারী ব্যবহারকারীরা কি আরও বড় ঝামেলা হবেন না? ক্লায়েন্টের দৃষ্টিকোণ থেকে এটি সম্ভবত একটি নো ইস্যু: 16 এমবি সাধারণত ডাউনলোডের সময় 1 মিনিটের বেশি হয় না, এবং তাদের পছন্দ হয় না যে তাদের প্রতিদিন একই ফাইল ডাউনলোড করতে হবে। অবশ্যই এটি পুরো ইনস্টলারের আকারের উপর নির্ভর করে: যদি পার্থক্যটি 5 এমবি এবং 21 মেগাবাইটের মধ্যে হয় তবে আমি এটি সম্পর্কেও চিন্তিত হব।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.