مشخصات مقاله
-
2208
-
0.0
-
15913
-
0
-
0
آموزش استخراج اطلاعات فایل و پوشه ها در زبان C#
وقتی با C# کار میکنی، همیشه قرار نیست فقط فایل و پوشه ایجاد کنی یا اونها رو تغییر بدی. توی خیلی از پروژهها لازم میشه قبل از انجام یک عملیات، اطلاعاتی مثل نام فایل، اندازه، مسیر یا زمان آخرین تغییرش رو بررسی کنی. اینجاست که آشنایی با ابزارهای مناسب در System.IO میتونه کار رو خیلی راحتتر کنه.
توی این بخش میخوایم با دو کلاس FileInfo و DirectoryInfo آشنا بشیم؛ کلاسهایی که برای به دست آوردن اطلاعات فایلها و پوشهها استفاده میشن. اگه داری مسیر یادگیری C# رو دنبال میکنی، شناخت این دو کلاس کمک میکنه کار با فایل و پوشه رو کاربردیتر و دقیقتر یاد بگیری.
آموزش استخراج اطلاعات فایل و پوشه ها در زبان C# :
کلاسهای File و Directory که توی بخشهای قبل باهاشون کار کردیم، برای کار مستقیم با فایلها و تغییر دادن پوشهها خیلی مناسب هستن. اما همیشه قرار نیست بخوایم یک فایل یا پوشه رو تغییر بدیم؛ گاهی فقط لازمه اطلاعاتی درباره اون به دست بیاریم.
برای این مواقع هم System.IO ابزارهای لازم رو در اختیارمون قرار میده و میتونیم از کلاسهای FileInfo و DirectoryInfo استفاده کنیم. توی این درس با چند مثال، نحوه کار با این دو کلاس رو بررسی میکنیم.
در کد مثال زیر، نحوه استفاده از کلاس FileInfo رو میبینیم:
static void Main(string[] args)
{
FileInfo fi = new FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
if(fi != null)
Console.WriteLine(String.Format("Information about file: {0}, {1} bytes, last modified on {2} - Full path: {3}", fi.Name, fi.Length, fi.LastWriteTime, fi.FullName));
Console.ReadKey();
}
در مثال بالا، اول یک نمونه از کلاس FileInfo ایجاد کردیم. این نمونه یک پارامتر دریافت میکنه که آدرس فایلیه که میخوایم اطلاعاتش رو به دست بیاریم.
در این پارامتر میتونیم نام یا مسیر هر فایل دلخواهی رو قرار بدیم، اما برای اینکه مثال کمی جالبتر باشه، آدرس فایل اجرایی EXE مربوط به برنامهای که در حال کامپایلش هستیم رو بهش دادهایم.
از اونجایی که در یک پروژه Console Application به فایل اجرایی یک پروژه از طریق WinForms assembly دسترسی نداریم، از Reflection برای دسترسی به آدرس assembly جاری استفاده کردهایم. توضیح کامل این موضوع خارج از محدوده این درسه، ولی فعلاً این نکته رو در نظر داشته باش تا در بخش جداگانهای به سراغ آموزش اون بریم.
وقتی یک نمونه از کلاس FileInfo داشته باشیم، میتونیم اطلاعات مختلفی درباره فایلی که بهش داده شده به دست بیاریم. پروژه مثال قبلی رو اجرا کن تا ببینی کلاس FileInfo خیلی مرتب و ساده، اطلاعات کاملی از فایل رو در اختیارت میذاره؛ حتی shortcutهایی که به متدهای کلاس File ارتباط دارن.
تا اینجا با FileInfo فقط به اطلاعات یک فایل دسترسی داشتیم. اما با کلاس DirectoryInfo میتونیم اطلاعات مربوط به تمام فایلها و پوشههای موجود در یک پوشه رو به دست بیاریم که قابلیت خیلی کاربردیایه. مثال زیر نحوه انجام این کار رو نشون میده:
DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
if(di != null)
{
FileInfo[] subFiles = di.GetFiles();
if(subFiles.Length > 0)
{
Console.WriteLine("Files:");
foreach(FileInfo subFile in subFiles)
{
Console.WriteLine(" " + subFile.Name + " (" + subFile.Length + " bytes)");
}
}
Console.ReadKey();
}
در این مثال، به جای اینکه یک نمونه از FileInfo بسازیم، یک نمونه از DirectoryInfo ایجاد کردیم. بعد هم مشابه مثال اول، مسیر موردنظر رو به دست آوردیم و با استفاده از متد GetDirectoryName() از کلاس Path، آدرس پوشه و نام اون رو از مسیر استخراج کردیم.
در ادامه از متد GetFiles() استفاده کردیم. هر عضو این آرایه نماینده یک فایل موجود در پوشه است. بعد با کمک یک حلقه loop داخل آرایه حرکت میکنیم و نام و سایز هر فایل رو در خروجی نمایش میدیم.
حالا اگه بخوایم لیست کامل پوشههای موجود در پوشه جاری رو هم داشته باشیم، میتونیم از کد زیر استفاده کنیم:
DirectoryInfo[] subDirs = di.GetDirectories();
if(subDirs.Length > 0)
{
Console.WriteLine("Directories:");
foreach(DirectoryInfo subDir in subDirs)
{
Console.WriteLine(" " + subDir.Name);
}
}
گاهی اوقات هم ممکنه فقط بخوایم فایلها یا پوشههایی با یک نام یا پسوند مشخص رو پیدا کنیم. خوشبختانه کلاسهای FileInfo و DirectoryInfo برای این کار هم امکانات مناسبی در اختیارمون میذارن.
مثلاً با کد زیر میتونیم به تمام فایلهایی که پسوند .exe دارن و داخل پوشه جاری هستن دسترسی پیدا کنیم:
FileInfo[] subFiles = di.GetFiles("*.exe");
همچنین کد زیر لیست کامل پوشههایی رو نمایش میده که عبارت “test” داخل نام اونها وجود داره:
DirectoryInfo[] subDirs = di.GetDirectories("*test*");
علاوه بر این، میتونیم جستجو رو به صورت بازگشتی انجام بدیم؛ یعنی فقط به پوشه فعلی محدود نباشیم و داخل زیرپوشهها و پوشههای تودرتو هم به دنبال فایلها و پوشههای موردنظر بگردیم. برای این کار میتونیم از کد زیر استفاده کنیم:
FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.AllDirectories);
اما اگه بخوایم فقط خود پوشه اصلی یا همون اولین پوشه در بالاترین سطح رو جستجو کنیم، میتونیم کد رو به شکل زیر تغییر بدیم:
FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.TopDirectoryOnly);
اگه میخوای کار با C# رو اصولیتر ادامه بدی و مفاهیم مختلف این زبان رو در کنار مثالهای کاربردی یاد بگیری، میتونی مسیر یادگیری خودت رو با دوره آموزش C# ادامه بدی. این دوره میتونه قدم بعدی خوبی برای آشنایی عمیقتر با مفاهیم و ابزارهای برنامهنویسی در C# باشه.