فشرده سازی فایل های متنی در سی شارپ

زمان هایی که فایل ها حجیم می شوند٬ بهترین راه برای کم کردن حجم فایل ها٬ فشرده سازی هست. فشرده سازی یک فرآیند برای کم کردن حجم کلی فایل ها می باشد. در این فرآیند داده های اضافی و زائد پیدا شده، به نحوی سازماندهی می شوند که فقط به یک داده اشاره داشته باشند. فشرده سازی در سرعت بارگذاری صفحات وب تاثیر زیادی دارد و با فشرده سازی صفحات می توانید سرعت سایت را بالا ببرید. همچنین از فشرده سازی فایل ها در بایگانی کردن یا هنگام اشتراک گذاری برای دانلود استفاده کنید. برای فشرده سازی برنامه های زیادی مثل Winrar یا ۷zip موجود هست اما بعضی وقت ها نیاز هست تا در درون خود برنامه اقدام به فشرده سازی فایل ها کنیم.
قبل از شروع خواستم بگویم که هرجا از کلمه « استخراج » استفاده کردم منظورم عبارت decompress هست چون برای این عبارت معنای دیگه ای پیدا نکردم.
فشرده سازی فایل ها با کلاس های GZipStream و DeflateStream
برای فشرده سازی فایل های متنی در سی شارپ ، در دات نت فضانام System.IO.Compression وجود دارد که دارای متد و کلاس هایی هست که کار فشرده سازی و استخراج فایل ها را به راحتی امکان پذیر می کند. این کلاس ها از الگوریتم های GZIP و Deflate هم پشتیبانی می کنند. در این نوشته ابتدا یک فایل متنی می سازیم و بعد با استفاده از ۲ متد گفته شده٬ فایل رو فشرده و استخراج می کنیم.البته روش کار در هر ۲ الگوریتم شبیه هم هست. برای استفاده از این ۲ الگوریتم به یک FileStream که به فایل مورد نظر ما اشاره می کند نیاز داریم. برای شروع یک پروژه کنسول به نام TextFileCompression ایجاد کنید.
۲ فضانام زیر رو به پروژه اضافه کنید:

ابتدا یک فایل معمولی رو با استفاده از کد زیر ایجاد کنید:

در خطوط ۵ تا ۸ یک متن مجازی ۱۰۰۰۰ خطه ساخته شد و در ۱۰ تا ۲۵ فایلی ساخته شد و در آدرس مذکور ذخیره گردید. فایل ایجاد شده حدود ۳۸۰ کیلوبایت حجم دارد. حالا با استفاده از کلاس compression از فضانام System.IO.Compression فایل فشرده گردید.
ابتدا فایل را با GZipStream به روش زیر فشرده می کنیم:

این کد شبیه کد قبل هست با این تفاوت که در خطوط ۱۵ و ۱۶ یک GZipStream ساخته شد که برای فشرده سازی از الگوریتم GZIP استفاده می کند. پس از ساخت FileStream ٬ یک GZipStream ساختیم که اولین پارامتر آن FileStream ساخته شده است که برای ساخت و تعیین مکان فایل استفاده می شود. دومین پارامتر نوع فشرده سازی هست که ۲ مقدار Compress و Decompress را دارد. در خط ۱۶ به جای اینکه FileStream را به StreamWriter ارسال کنیم٬ GZipStream را ارسال می کنیم. وقتی در خط ۱۸ متد Write رو فراخوانی شد٬ به صورت خودکار با استفاده از الگوریتم GZIP فشرده و در فایل نوشته می شوند. اگر حجم فایل ساخته شده را نگاه کنید٬ حجم فایل از ۳۸۰ کیلوبایت به ۴۰ کیلوبایت کاهش پیدا کرده است. مقدار فشردگی به میزان افزونگی فایل و به حجم کلی فایل بستگی دارد. چون در این فایل ۱۰۰۰۰ بار یک جمله تکرار شده٬ این الگوریتم تمام ۹۹۹۹ جمله رو به یک جمله اشاره می دهد و به این ترتیب حجم فایل کاهش پیدا می کند. اگر فایل رو باز کنید فقط یک سری علایم نامفهوم مشاهده می کنید.
همونطور که در کد پایین مشاهده می کنید، استفاده از DeflateStream خیلی شبیه استفاده از کلاس GZipStream هست:

حجم فایل مانند قبل ۴۱ کیلوبایت شده بود. البته استفاده از این الگوریتم فایل را کمی فشرده تر می کند.

استخراج فایل فشرده شده
برای استفاده از فایل های فشرده شده٬ باید از حالت فشردگی خارج شوند. این کار با استفاده از ۲ کلاس GZipStream و DeflateStream به راحتی امکان پذیر هست. مانند بالا اول با استفاده از GZipStream فایل را از حالت فشردگی خارج میکنیم. دقت داشته باشید که با همان روشی که فایل رو فشرده کردید باید از فشردگی خارج کنید در غیراین صورت به خطا بر می خورید. مثلا اگر با GZipStream فایلی را فشرده کرده اید٬ با همان GZipStream باید فایل را استخراج کنید.

در خطوط ۵ و ۶ یک FileStream ساخته شده که به فایل فشرده شده اشاره دارد. از مقادیر FileMode.Open و FileAccess.Read استفاده شده است تا بتوان فایل را باز کرد و فقط خواند. در خط ۸ که یک GZipStream ساخته شده٬ به پارامتر دوم مقدار CompressionMode.Decompress دادیم تا فایل را از خالت فشرده خارج کند. GZipStream ساخته شده را در خط ۱۰ به StreamReader ارسال می کنیم تا محتوای فایل خوانده شود. در خط ۱۱ از متد ReadToEnd استفاده کردیم تا محتوای فایل تا آخر خوانده شود و به رشته تبدیل گردد و در متغیر contents ریخته شد و در آخر contents رو چاپ گردید.
در کد زیر نحوه استفاده از DeflateStream قرار گرفته است :

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *