برای فشرده سازی فایل متنی در سی شارپ، فضای نام System.IO.Compression وجود دارد که دارای متد و کلاسهایی هست که کار فشردهسازی و استخراج فایلها را بهراحتی امکانپذیر میکند. این کلاسها از الگوریتمهای GZIP و Deflate هم پشتیبانی میکنند. در این مقاله ابتدا یک فایل متنی میسازیم و بعد با استفاده از ۲ متد گفتهشده، فایل را فشرده و استخراج میکنیم. البته روش کار در هر ۲ الگوریتم شبیه هم هست. برای استفاده از این ۲ الگوریتم به یک FileStream که به فایل موردنظر ما اشاره میکند نیاز داریم. برای شروع یک پروژه کنسول به نام TextFileCompression ایجاد کنید.
ساخت پروژه فشرده سازی فایل متنی در سی شارپ
- دو فضای نام زیر را به پروژه اضافه کنید
using System.IO; using System.IO.Compression; using System.IO; using System.IO.Compression;
- ابتدا یک فایل معمولی را با استفاده از کد زیر ایجاد کنید:
static void Main(string[] args) { StringBuilder data = new StringBuilder(); for (int i = 1; i < 10001; i++) { data.AppendLine(string.Format("{0}\tCompress and Decompressing File!",i)); } try { FileStream stream = new FileStream(@"C:\compressfile.txt", FileMode.Create, FileAccess.Write); StreamWriter writer = new StreamWriter(stream); writer.Write(data.ToString()); writer.Close(); Console.WriteLine("A compressed file was created!"); } catch(IOException ex) { Console.WriteLine("File not created for " + ex.Message); } }
- در کد بالا یک متن مجازی ۱۰۰۰۰ خطه ساخته شد و در آدرس مذکور ذخیره گردید.
- فایل ایجاد شده حدود ۳۸۰ کیلوبایت حجم دارد.
- حالا با استفاده از کلاس compression از فضای نام System.IO.Compression فایل فشرده گردید.
این مطلب را از دست ندهید: کاهش حجم تصاویر هنگام آپلود در Asp.net
ابتدا فایل را با GZipStream به روش زیر فشرده می کنیم:
static void Main(string[] args) { StringBuilder data = new StringBuilder(); for (int i = 1; i < 10001; i++) { data.AppendLine(string.Format("{0}\tCompress and Decompressing File!",i)); } try { FileStream stream = new FileStream(@"C:\compressfile.txt", FileMode.Create, FileAccess.Write); GZipStream gzip = new GZipStream(stream, CompressionMode.Compress); StreamWriter writer = new StreamWriter(gzip); writer.Write(data.ToString()); writer.Close(); Console.WriteLine("A compressed file was created!"); } catch (IOException ex) { Console.WriteLine("File not created for " + ex.Message); } }
این کد شبیه کد قبل هست با این تفاوت که در خطوط ۱۵ و ۱۶ یک GZipStream ساخته شد که برای فشردهسازی از الگوریتم GZIP استفاده میکند. پس از ساخت FileStream ٬ یک GZipStream ساختیم که اولین پارامتر آن FileStream ساختهشده است که برای ساخت و تعیین مکان فایل استفاده میشود. دومین پارامتر نوع فشردهسازی هست که ۲ مقدار Compress و Decompress را دارد. در خط ۱۶ به جای اینکه FileStream را به StreamWriter ارسال کنیم٬ GZipStream را ارسال میکنیم. وقتی در خط ۱۸ متد Write رو فراخوانی شد٬ بهصورت خودکار با استفاده از الگوریتم GZIP فشرده و در فایل نوشته میشوند.
اگر حجم فایل ساختهشده را نگاه کنید٬ حجم فایل از ۳۸۰ کیلوبایت به ۴۰ کیلوبایت کاهش پیداکرده است. مقدار فشردگی به میزان افزونگی فایل و به حجم کلی فایل بستگی دارد. چون در این فایل ۱۰۰۰۰ بار، یک جمله تکرار شده، این الگوریتم تمام ۹۹۹۹ جمله رو به یک جمله اشاره میدهد و بهاینترتیب حجم فایل کاهش پیدا میکند. اگر فایل را باز کنید فقط یک سری علائم نامفهوم مشاهده میکنید.
همانطور که در کد پایین مشاهده میکنید، استفاده از DeflateStream خیلی شبیه استفاده از کلاس GZipStream است:
static void Main(string[] args) { StringBuilder data = new StringBuilder(); for (int i = 1; i < 10001; i++) { data.AppendLine(string.Format("{0}\tCompress and Decompressing File!", i)); } try { FileStream stream = new FileStream(@"C:\compressfile.txt", FileMode.Create, FileAccess.Write); DeflateStream deflate = new DeflateStream(stream, CompressionMode.Compress); StreamWriter writer = new StreamWriter(deflate); writer.Write(data.ToString()); writer.Close(); Console.WriteLine("A compressed file was created!"); } catch (IOException ex) { Console.WriteLine("File not created for " + ex.Message); } }