آموزش استخراج فایل های فشرده با زبان برنامه نویسی #C

فشرده سازی چیست؟ ‌

هر فایل، چیزی جز داده نیست. بایت‌هایی که در کنار هم قرار گرفته و اطلاعات یک فایلی را به‌وجود آورده‌اند. زمانی که یک فایل فشرده ایجاد می‌شود، این فایل فشرده، باتوجه به فرمت خود، طبیعتا یک ساختمان و ساختار از پیش تعریف‌شده‌ای برای خود دارد. از طرفی، این فایل فشرده نیز همانند همان فایل‌های دیگر، چیزی جز داده نیست. این فایل فشرده، بایت‌ها یا همان داده‌های هر یک از فایل‌های انتخاب شده را درون خود قرار می‌دهد. یک آشپزخانه را در نظر بگیرید که ظرف و ظروف مختلفی دارد؛ برخی از این ظروف، کاربردشان این است که ظروف دیگری را در آنها قرار دهیم. اکنون این فایل‌های فشرده نیز ساختار و ساختمانشان این است که بایت‌های هر فایلی را به‌صورت جدا از هم، درون خود قرار  داده و به یک فایل واحدی تبدیل شوند؛ و سپس در زمان دیگری، بتوان آن فایل‌ها را از داخل این فایل فشرده بیرون کشیده و مورد استفاده قرار داد.

به عبارت ساده‌تر، فشرده‌سازی فایل (یا فشرده‌سازی داده‌ها) عملی برای کاهش اندازه فایل در ضمن حفظ داده‌های اصلی است. انجام این کار باعث می‌شود علاوه بر این، انتقال فایل از طریق اینترنت یا موارد دیگر، فضای کمتری را در یک دستگاه ذخیره‌سازی داشته باشد. توجه به این نکته ضروری است که فشرده‌سازی نامتناهی نیست. درحالی‌که فشرده‌سازی پرونده در یک ZIP ، سایز آن را کاهش می‌دهد. شما نمی‌توانید فشرده‌سازی فایل را ادامه دهید تا سایز آن به دوباره کاهش یابد.

نکته ی مهم دیگر این است که در برخی از فرمت‌های فایل‌های فشرده، امکان قرار دادن هر فایلی با هر فرمتی درونشان وجود دارد؛ اما در برخی دیگر، چنین امکانی نیست. برای مثال، RAR  و ZIP  آزاد هستند که هر چیزی درونشان قرار بگیرد؛ اما GIF یا فایل تصویری متحرک، فقط می‌تواند شامل تصاویر باشد. اگر درون گیف چیزهای دیگری قرار دهیم، دیگر از ساختار اصلی خود خارج شده و یک فرمت گیف نیست.

تفاوت بین فرمت‌های Zip و RAR

  • فرمت Zip در سال ۱۹۸۶ به وسیله Katz توسعه داده شد؛ درحالی که فرمت RAR به‌وسیله فردی از روسیه به نام Eugene Roshal ایجاد شد.
  • فرمت Zip قبل از فرمت RAR توسعه یافته بود.
  • فرمت RAR به نرم‌افزاری برای باز کردن نیاز دارد، در حالی که فرمت Zip در ویندوز، مک و برخی توزیع‌های لینوکس به طور پیش‌فرض باز می‌شود.
  • فرمت RAR فشرده‌سازی بهتری نسبت به فرمت Zip دارد و حجم بیشتری را کاهش می‌دهد.
  • هر دو فرمت می‌توانند فایل‌ها را رمزگذاری کنند.
  • شما با فرمت Zip نمی‌توانید فایل‌های بزرگ را به اندازه‌های کوچک‌تر تقسیم کنید در حالی که با فرمت RAR این موضوع امکان پذیر است. یک کاربرد مهم تقسیم کردن فایل‌ها در آپلود فایل‌های حجیم است.

معرفی برخی از نرم افزارهای فشرده سازی

  • نرم‌افزار Hamster Zip Archiver

شاید در میان نرم‌افزارهای فشرده‌سازی Hamster Zip Archiver  انتخاب اول نباشد اما کارایی بسیار بالایی دارد. این نرم‌افزار از فرمت‌های بسیاری پشتیبانی می‌کند، طراحی بسیار خوبی دارد و از همه مهم‌تر رایگان است. ویژگی دیگر آن کاربری بسیار آسان است که حتی برخی از افراد مبتدی نیز می‌توانند از آن به سادگی استفاده کنند. شما می‌توانید برای فشرده‌سازی فایل‌ها یا باز کردن فایل فشرده‌شده، آن‌ها را انتخاب و در نرم‌افزار قرار دهید (Drag and Drop). در واقع شما می‌توانید یک فایل فشرده‌شده را ایجاد کنید و در دراپ باکس به اشتراک بگذارید. فشرده‌سازی فایل‌ها برای به اشتراک گذاری آن‌ها یک ایده بسیار مهم است. اگر مایل به استفاده از کشیدن فایل و رها کردن آن نیستید به جای آن می‌توانید از منوی نرم‌افزار استفاده کنید. تنها عیب نرم‌افزار این است که فقط مخصوص ویندوز است.

  • نرم‌افزار WinZip

نرم‌افزار WinZip اولین ابزار فشرده‌سازی فایل بود که هنوز عالی کار می‌کند و به نسخه ۲۱ خود رسیده است. WinZip یک نرم‌افزار رایگان نیست و بیش از ۳۰ دلار قیمت دارد که به خاطر برخی ویژگی‌های بسیار قوی و جالب آن است. WinZip  فرمت‌های بسیاری همچون Zip، ZIPX، 7z، TAR، GZIP، VHD و XZ را پشتیبانی می‌کند. همچنین فرمت RAR را هنگام باز کردن فایل (و نه فشرده‌سازی فایل) می‌شناسد. WinZip با بسیاری از برنامه‌ها همچون آفیس یکپارچه و ادغام شده است. ویژگی مهم دیگر این نرم‌افزار شکستن فایل‌های بسیار بزرگ برای آپلود و به اشتراک‌گذاری است. همچنین یک پنجره مانند Windows Explorer در ویندوز دارد که می‌توانید فایل‌های خودتان را بررسی و مشاهده کنید. این نرم‌افزار تنظیمات موس و کیبورد زیادی دارد که به منظور استفاده در وسایل قابل‌لمس مفید هستند. از نظر امنیتی WinZip تنظیمات فراوانی برای محافظت از فایل‌های شما ارائه می‌دهد.

  • نرم‌افزار WinRAR

نرم‌افزار Winrar برای فرمت RAR ایجاده شده و مهم‌ترین کاربرد آن فشرده‌سازی زیاد و تنظیمات مربوط به این بخش است. اکثر برنامه‌های فشرده‌سازی می‌توانند فایل‌های آرشیو RAR را باز کنند اما تنها WinRAR می‌تواند آن‌ها را ایجاد کند. این نرم‌افزار به دلیل همین انحصار رایگان نیست اما شما می‌توانید آن را به همراه کرک از سایت‌های ایرانی دانلود نمایید. البته WinRAR علاوه بر فرمت RAR می‌تواند فایل‌ها را به فرمت‌های دیگر فشرده‌سازی نیز تبدیل کند. این نرم‌افزار را می‌توان در ویندوز، لینوکس، مک و … مورد استفاده قرار داد. نرم‌افزار WinRAR با وجود داشتن تم‌های مختلف، رابط کاربری زیبایی ندارد اما قابلیت‌های فراوانی دارد و با پنجره ویزارد آن کارهای متفاوتی را می‌توان انجام داد. سرعت بالا در فشرده‌سازی و همچنین باز کردن فایل‌ها یکی از ویژگی‌های آن است. در WinRAR رمزگذاری بسیار پیشرفته چندسطحی، از بالاترین کیفیت برخوردار است.

  • نرم‌افزار PeaZip

این نرم‌افزار یک ابزار رایگان و قدرتمند جهت فشرده‌سازی فایل‌های شما است که در سیستم‌عامل‌های لینوکس و ویندوز می‌توانید از آن استفاده کنید. PeaZip تنظیمات مختلف فشرده‌سازی و رمزگذاری و Extract فایل‌ها را دارد و برای تبدیل فرمت آرشیوها نیز بهترین گزینه است. برای  کار با این نرم‌افزار شما می‌توانید از منوی آن یا از روش کشیدن و رها کردن (Drag and Drop) استفاده کنید.

  • نرم افزار 7Zip

نرم‌افزار 7Zip یکی دیگر از نرم‌افزارهای معروف فشرده‌سازی فایل است که می‌تواند تقریباً همه فرمت‌های فایل را پشتیبانی کند. این نرم‌افزار یک فرمت اختصاصی 7z دارد که توان رقابت با RAR و Zip را دارد. یک ویژگی بسیار مهم آن، فشرده‌سازی فایل‌های بسیار بزرگ (براساس توسعه‌دهندگان آن تا ۱۶ میلیون گیگ!) است. این نرم‌افزار در فشرده‌سازی حجم زیادی را کاهش می‌دهد؛ البته عیب این روش سرعت پایین آن است. همچنین 7z یک قابلیت به نام «solid ocmpression» دارد که از فایل‌های بزرگ می‌تواند فایل‌های بسیار کوچک ایجاد کند؛ این قابلیت کاربردی هم بسیار کند است.

دیگه وقتشه بریم سراغ برنامه 🙂

در این برنامه که یک Console Application با زبان برنامه نویسی c# است، می خواهیم برنامه ای بنویسیم که فایل های فشرده مورد نظر را از مسیر ورودی خوانده و سپس در مسیر خروجی استخراج نماید. لازم به ذکر است که بعضی از این فایل ها ممکن است رمز داشته باشد، بنابراین لیستی از رمزها را برای بررسی رمز عبور مناسب، در برنامه قرار داده ایم.

 public class ExtractZipFiles
    {
        private readonly List _passwordList;
        private readonly List _fileTypes;
        private readonly string _inputPath;
        private readonly string _outputPath;
        public List Files { get; set; }
        public ExtractZipFiles()
        {
            this._passwordList = new List() { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
            this._fileTypes = new List() { "zip", "7z", "rar" };
            this._inputPath = @"C:\Input";
            this._outputPath = @"C:\Output";
        }
}

ابتدا کلاسی با عنوان ExtractZipFiles ایجاد می کنیم. این کلاس فیلد هایی تحت عنوان لیستی از رمزها، لیستی از انواع فایل ها، مسیر ورودی و خروجی دارد. در سازنده این کلاس یا می توان فیلدهای مورد نظر را از پایگاه داده گرفت یا به صورت پیش فرض، اطلاعات آماده به آنها داد که ما در اینجا تمام اطلاعات را به صورت پیش فرض به فیلدهای مورد نظر داده ایم.

  public void Run()
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            this.Files = new List();
            foreach (var item in this._fileTypes)
            {
                if (Directory.Exists(this._inputPath))
                {
                    var files = Directory.GetFiles(this._inputPath, $"*.{item}", SearchOption.AllDirectories);
                    foreach (var path in files)
                    {
                        Extract(path);
                    }
                }
            }
        }

این متد، نقطه شروع فراخوانی کلاس ما می باشد. اولین خط این متد برای استخراج فایل های فشرده با نام فارسی به کار می رود. حلقه ابتدایی بر روی انواع داده ای مورد نظر است، سپس بعد از بررسی وجود مسیر ورودی، فایل هایی با نوع داده ای خاص که در حلقه ابتدایی مشخص شده است، گرفته می شود و سپس عملیات Extract بر روی هر یک از این فایل ها انجام می شود.

  private void Extract(string path)
        {
            SevenZip.SevenZipExtractor.SetLibraryPath("x64/7z.dll");
            var file = new FileModel(path);
            var correctPassword = false;
            var list = new List(_passwordList);
            while (!correctPassword)
            {
                try
                {
                    using var extr = new SevenZip.SevenZipExtractor(path, list.First());
                    list.Remove(list.First());
                    if (!list.Any())
                    {

                        // پسورد در فایل موجود نمی باشد
                        file.Message = "Bad Password";
                        file.Status = false;
                    }
                    else
                    {
                        extr.ExtractArchive(_outputPath);
                        file = GetZipEntries(file, extr);
                        file.Message = "Success";
                        file.Status = true;
                    }
                    correctPassword = true;
                    this.Files.Add(file);
                }
                catch (Exception ex)
                {
                    correctPassword = false;
                }
            }

        }

این برنامه از اسمبلی SevenZipSharp برای استخراج فایل های فشرده استفاده می کند. برای این کار، ابتدا 7z.dll را در مسیر این اسمبلی قرار می دهیم. سپس کلاس از نوع FileModel که پیش تر در مورد آن صحبت خواهیم کرد را new می کنیم. برای چک کردن و انتخاب پسورد مناسب باید از حلقه While استفاده کرد. در این مکانیزم بعد از فراخوانی متد ExtractArchive، اگر رمز استفاده شده درست باشد، سراغ خط بعدی متد می رود و با true شدن correctPassword، از حلقه خارج می شود. و در نهایت بعد از پر کردن پروپرتی های کلاسی از نوع FileModel، این شی به پروپرتی Files اضافه می گردد. شما می توانید به جای این خط، متدی بنویسید که این اطلاعات را در پایگاه داده لاگ کند. لازم به ذکر است اگر رمزی که به کار می رود، نادرست باشد، این رمز از لیست ما خارج می شود. اگر در نهایت لیست رمزها خالی شد و هیچ رمز مناسبی برای این فایل نبود، وضعیت Bad Password برای این فایل ثبت می شود.

 private FileModel GetZipEntries(FileModel model, SevenZip.SevenZipExtractor extr)
        {
            var files = new List();
            model.FullPath = extr.FileName;
            foreach (var item in extr.ArchiveFileData)
            {
                var file = new FileModel()
                {
                    FileName = item.FileName,
                    FileType = item.FileName.Split(".")[1],
                    Size = item.Size,
                    FullPath = $"{this._outputPath}\\{item.FileName}"
                };
                files.Add(file);
            }
            model.Files = files;
            return model;
        }

متد GetZipEntries برای پر کردن اطلاعات فایل های زیر مجموعه این فایل فشرده استفاده می شود. همانطور که در کلاس FileModel می بینید، این کلاس لیستی از نوع FileModel دارد که برای فایل های داخل فایل زیپ در نظر گرفته شده است. در این برنامه، ما این اطلاعات را لاگ می گیریم.

public class FileModel
    {
        public FileModel()
        {
            Files = new List<FileModel>();
        }
        public FileModel(string path)
        {
            FileName = Methods.GetFileNameByPath(path);
            FileType = FileName.Split(".")[1];
            Files = new List<FileModel>();
        }
        public int Id { get; set; }
        public string FileName { get; set; }
        public ulong Size{ get; set; }
        public string FileType { get; set; }
        public string FullPath { get; set; }
        public string Message { get; set; }
        public bool Status { get; set; }
        public List Files { get; set; }
    }
  public static class Methods
    {
        public static string GetFileNameByPath(string path)
        {
            if (string.IsNullOrEmpty(path)) return string.Empty;
            var list = path.Split('\\').ToList();
            if (!list.Any()) return string.Empty;
            return list.Last();
        }
    }

در سازنده کلاس FileModel، متد GetFileNameByPath فراخوانی شده است. کار این متد این است که نام فایل را از مسیر وارد شده به سازنده این کلاس، جدا می کند.

امیدوارم که این آموزش برای شما مفید واقع شود. نظرات سازنده شما میتواند راه گشای کار ما باشد. لطفا برای ارتقای سطح کیفی آکادمی Nahazi.ir، به ما کمک کنید.

اشتراک در
اطلاع از
guest
14 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
رضا خوارزمیان

بسیار عالی و کاربری تنکیو ورری ماچ

محمد قدیمی آزاد

سلام
متوجه نشدم کجا چک میکنه که فایل فشرده داری پسورد هست یا نه که بعد دنبال تست پسوردها بره. ممنون میشم راهنمایی کنید.

محمد قدیمی آزاد

ممنون از توضیحاتت

علی.ک

مطلب مفید و جامعی بود. ممنون بابت پست خوبت.

اولادحمزه

بسیار عالی…
با آرزوی موفقیت برای شما

صبا

زیبا وقابل تحسین قلمتون سبز🤍💚

مجتبی رضایی

ممنون، بسیار مفید بود

آخرین مقاله ها

مشاهده کنید

آخرین دلنوشته ها

مشاهده کنید

آخرین ویدیو ها

مشاهده کنید

آخرین پادکست ها

مشاهده کنید

ما چه خدماتی به شما ارائه خواهیم کرد؟

مشاوره رایگان

مشاوره رایگان

شما می توانید با آسان ترین روش ممکن با متخصصین تیم ما ارتباط برقرار کنید و ما در کمترین زمان ممکن پاسخگو خواهیم بود.

بیشتر بخوانید
توسعه و طراحی سایت

توسعه و طراحی سایت

توسعه و طراحی سایت شما را به صورت واکنش گرا و جذاب انجام می دهیم. با ما تماس بگیرید و مشاوره رایگان دریافت کنید.

بیشتر بخوانید
14
0
افکار شما را دوست داریم، لطفا نظر دهید.x
اسکرول به بالا