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

زمان هایی که فایل ها حجیم می شوند٬ بهترین راه برای کم کردن حجم فایل ها٬ فشرده سازی هست. فشرده سازی یک فرآیند برای کم کردن حجم کلی فایل ها می باشد. در این فرآیند داده های اضافی و زائد پیدا شده، به نحوی سازماندهی می شوند که فقط به یک داده اشاره داشته باشند. فشرده سازی در سرعت بارگذاری صفحات وب تاثیر زیادی دارد و با فشرده سازی صفحات می توانید سرعت سایت را بالا ببرید. همچنین از فشرده سازی فایل ها در بایگانی کردن یا هنگام اشتراک گذاری برای دانلود استفاده کنید. برای فشرده سازی برنامه های زیادی مثل 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 قرار گرفته است :

فارسی سازی Telerik GridView

کسانی که برنامه نویسی می کنند٬ در بعضی مواقع نیاز به استفاده از کنترل های شرکت های ثالث مثل Janus ٬ Telerik و DevComponents هستند. هر کدام از این کامپوننت ها ویژگی های خود را دارد که نسبت به بقیه کامپوننت ها متمایز می شود.
یکی از ویژگی هایی که کامپوننت های شرکت Telerik دارد٬ ویژگی Localization هست. Localization به معنای بومی سازی و محلی سازی کامپوننت برای مشتری است. بیشتر کامپوننت های این شرکت این ویژگی را دارند.(نسخه Q3.2010 به بعد این شرکت ویژگی Localization را دارند.)
ویژگی دیگر کامپوننت های این شرکت پشتیبانی از RTL برای زبان فارسی و عربی است که با خیال آسوده می توان در برنامه های فارسی از این کامپوننت ها استفاده کرد.
فارسی سازی GridVieTelerikw ابتدا فضانام زیر را وارد کنید:

پس از وارد کردن فضانام بالا٬ کلاس زیر را ایجاد کنید:

پس از ساخت این کلاس٬ در فرمی که GridView را دارد یا در Program.cs خط زیر را وارد کنید.

GridView به راحتی فارسی شد. می توانید RTL این کنترل را نیز فعال کنید. در صورتیکه پیشنهاد بهتری برای ترجمه ها دارید در قسمت دیدگاه ها بیان بفرمایید.

تهیه نسخه پشتیبان از SQL Express و بازیابی آن

برای تهیه نسخه پشتیبان از دیتابیس های موجود در SQL Server راه های زیادی وجود دارد. یکی از این راه ها استفاده از SQL Server Management Studio هست و می توان با چند کلیک ساده از دیتابیس های موجود نسخه پشتیبان تهیه کرد. یکی دیگر از راه ها استفاده از دستورات خود SQL هست. در خیلی از برنامه های تجاری٬ امکانی به نام تهیه نسخه پشتیبان وجود دارد. برای اینکار می توان از دستورات سی شارپ و اجرای یک کوئری استفاده کرد.
اگر بر فرض Connection String برنامه برای اتصال به SQL Server مانند زیر باشد:

برای تهیه نسخه پشتیبان می توان کوئری زیر را در دیتابیس اجرا کرد:

حالا فرض کنید شما با خود ویژوال استدیو یک دیتابیس به نام myDatabase.mdf ایجاد کرده اید. این دیتابیس در Management Studio متصل نیست و در کامپیوتر کابر نهایی هم فقط یک پیش نیاز(prerequireSQL Express نصب می شود. پس Connection String شما باید به صورت زیر باشد:

اگر بخواهید مانند SQL Server و با اجرای کد بالا از دیتابیس نسخه پشتیبان بگیرید به خطای زیر بر میخورید:

این خطا به این علت هست که این کوئری نمی تواند به فایل دیتابیس دسترسی پیدا کند. اگر Studio Management نصب بود٬ کوئری با استفاده از Studio Management به فایل دیتابیس دسترسی پیدا می کرد٬ چون دیتابیس Attach بود٬ اما در SQL Express دیتابیس در جایی قرار ندارد.
تهیه نسخه پشتیبان از SQL Express و بازیابی آن کمی متفاوت است، پس Connection String را به شکل زیر تغییر دهید:

حالا با اجرای کوئری زیر می توانید نسخه پشتیبان را تهیه کنید:

حتما دقت کنید که آدرس فایل باید بین [ و ] قرار بگیرد.
برای بازیابی (Restore) کردن نسخه پشتیبان هم از کوئری زیر می توانید استفاده کنید:

نامگذاری مجارستانی در دات نت

نامگذاری در هر پروژه ای، چه پروژه گروهی و چه پروژه انفرادی از اهمیت خاصی برخوردار است. استفاده از استانداردهای نامگذاری، می تواند منجر به سهولت خوانایی پروژه توسط افراد، اتلاف وقت کمتر، جلوگیری از اشتباهات منطقی و … گردد.
یکی از استاندارهای نامگذاری، نامگذاری به روش مجارستانی (Hungarian notation) است. در این روش، اکثر اشیاء و … به ۳ حرف اصلی تبدیل می شوند و این سه حرف معرف یک نوع می باشد. برای نمونه نوع عددی Integer به int در این روش تبدیل می شود.
در زیر لیست تقریبا کاملی برای انواع داده ها و اشیاء موجود در دات نت را آورده ام:
۱- متغیرهای خصوصی (Private) : برای نامگذاری، ابتدای نام متغیر یک “_” و سپس نامگذاری مجاری نوع متغیر نوشته می شود. مانند:

۲- متغیرهای محلی (Local) :
برای این نوع متغیرها، فقط پیشوند مجارستانی نوع متغیر نیاز است و بعد از آن نام متغیر.

۳- فضانام ها (Namespace) :
فضانام ها به صورت [CompanyName.TechnologyName[.Feature][.Design نامگذاری می شوند که Feature و Design به صورت اختیاری‌ست. به جای نام شرکت می توان از نام های تثبیت شده نیز استفاده کرد.

۴- کلاس ها :
از پیشوند و یا “_” برای نامگذاری استفاده نکنید. برای نامگذاری از روش پاسکال استفاده کنید.

۵- رابط (Interface) :
در ابتدای نام رابط از “I” استفاده شود. نیاز به استفاده از “_” نیست. بقیه نام نیز از نامگذاری پاسکال استفاده شود.

۶- پارامتر :
نام پارامترها باید دارای توضیح کاملی برای پارامتر باشد. در ابتدای نام از “p” استفاده کنید.

۷- متد ها :
از افعال و یا عبارات فعلی به صورت پاسکال استفاده کنید.

۸- خاصیت و انواع شمارشی (Property / Enumerations) :
از نام و عبارات اسمی به صورت پاسکال استفاده شود.

۹- رخداد ها (Event) :
از پسوند EventHandler استفاده کنید. رخداد دو پارامتر sender و e را دارا می باشد. پارامتر e نشان دهنده شیئ ست که رخداد را فراخوانده است و sender نیز نوع شیئ است که می توان با آن از انواع دیگری استفاده کرد. برای نامگذاری sender از پسوند EventArgs استفاده کنید. نامگذاری به صورت پاسکال باشد.

۱۰- استثناء (Exception) :
برای جلوگیری از هم نام شدن با پارامتر e رخداد، از ex برای نام گذاری استثناء استفاده کنید.

۱۱- ثابت ها (Constant) :
تمامی حروف ثابت باید بزرگ باشد و برای جدا کردن کلمات از “_” استفاده شود.

۱۲- نوع های اولیه :

۱۳- کنترل های ویژوال :

تعیین سطح دسترسی (UAC) اپلیکیشن

در بسیاری از برنامه نیاز به سطح دسترسی بالاتری برای دسترسی به فایل ها و فولدرها و رجیستری ویندوز هست. به عنوان مثال با استفاده از Environment.SpecialFolder.MyDocuments می توان به فولدر Document ویندوز دسترسی پیدا کرد. در ویندوز ۷ و ویستا، یک لایه برای کنترل سطح دسترسی (UAC) اضافه شده است. به همین دلیل است که قبل از اجرای بسیاری از برنامه ها، ویندوز از شما سوال می کند که می خواهید برنامه اجرا شود یا خیر. وقتی پرژه تمام می شود پس از ساخت Setup و نصب آن در سیستم مشتری اگر از کدهای استاندارد مانند Path.Combine استفاده نشده باشد، قبل از اجرا، خطای سطح دسترسی داده می شود و برنامه بسته می شود. برای رفع این مشکل باید تغییراتی در فایل manifest.xml برنامه داد. اگر این فایل در پروژه شما وجود ندارد بر روی پروژه کلیک راست کنید و از منوی Add، گزینه Add New Item را انتخاب کنید. به زیر مجموعه General بروید و Application Manifest File را انتخاب کنید. پس از اینکه فایل ساخته شد، آن را باز کنید. کدها به صورت زیر است:

تگی که ما به آن نیاز داریم، تگ requestedPrivileges است. در این تگ یک تگ دیگر به نام requestedExecutionLevel وجود دارد که خاصیت level آن، تعیین کننده سطح دسترسی است. اگر آن را بر روی requireAdministrator تنظیم کنید، قبل از اجرای برنامه ویندوز از کاربر درخواست تایید سطح دسترسی می کند و برنامه به طور درست اجرا می شود.
برای اطلاعات بیشتر می توانید به (^) مراجعه کنید.