مقدمه
به فصل نوزدهم خوش آمدید. تقریباً تمام برنامههای کاربردی در دنیای واقعی، در مقطعی نیاز به تعامل
با سیستم فایل (File System) دارند. این تعامل میتواند شامل خواندن و نوشتن داده
در فایلها، ایجاد و حذف پوشهها، یا جستجو برای پیدا کردن فایلهای خاص باشد. فریمورک
.NET یک API بسیار غنی و قدرتمند را در فضای نام System.IO برای کار با فایلها و
پوشهها فراهم کرده است.
در این درس، با کلاسهای اصلی این فضای نام آشنا میشویم و یاد میگیریم که چگونه اطلاعات مربوط به
درایوها، پوشهها و فایلها را به دست آوریم، آنها را ایجاد، کپی، جابجا و حذف کنیم. این درس،
پایهی اصلی برای درک نحوهی خواندن و نوشتن دادههاست که در درسهای بعدی به آن خواهیم پرداخت.
کلاسهای استاتیک در مقابل کلاسهای نمونه
API فضای نام System.IO برای کار با فایلها و پوشهها، دو
رویکرد موازی را ارائه میدهد: استفاده از کلاسهای استاتیک و استفاده از
کلاسهای نمونه (instance).
- کلاسهای استاتیک (Directory, File): این کلاسها مجموعهای از
متدهای
استاتیک را برای انجام عملیات بر روی فایلها و پوشهها فراهم میکنند. شما برای استفاده از
آنها نیازی به ساختن نمونه ندارید و مسیر فایل یا پوشه را به عنوان یک رشته به متدها پاس
میدهید. این روش برای انجام یک یا دو عملیات سریع و ساده بسیار مناسب است.
- کلاسهای نمونه (DirectoryInfo, FileInfo): این کلاسها
نمایانگر یک پوشه
یا فایل خاص هستند. شما ابتدا یک نمونه از آنها را با دادن مسیر میسازید و سپس متدهای نمونه
را بر روی آن شیء فراخوانی میکنید. این روش زمانی کارآمدتر است که بخواهید چندین عملیات را بر
روی یک فایل یا پوشهی واحد انجام دهید، زیرا سیستمعامل برخی از اطلاعات امنیتی و وضعیتی را کش
(cache) میکند.
کار با پوشهها (Directories)
بیایید با استفاده از هر دو رویکرد، عملیات رایج بر روی پوشهها را بررسی کنیم.
ایجاد و حذف پوشهها
برای ایجاد و حذف پوشهها، میتوانیم از کلاس استاتیک Directory و یا کلاس نمونه
DirectoryInfo استفاده کنیم. در مثال زیر، نحوهی انجام این کار را با هر دو روش نشان
دادهایم:
Program.cs
using System.IO;
string staticPath = "C:\\MyStaticFolder";
Directory.CreateDirectory(staticPath);
if (Directory.Exists(staticPath))
{
Directory.Delete(staticPath);
Console.WriteLine("Static folder deleted.");
}
string instancePath = "C:\\MyInstanceFolder";
DirectoryInfo dirInfo = new DirectoryInfo(instancePath);
dirInfo.Create();
if (dirInfo.Exists)
{
dirInfo.Delete();
Console.WriteLine("Instance folder deleted.");
}
در این مثال، ابتدا یک پوشه با استفاده از متد CreateDirectory از کلاس
Directory ایجاد
میکنیم و سپس با استفاده از متد Exists بررسی میکنیم که آیا پوشه با موفقیت ایجاد شده
است یا خیر. در صورت وجود، پوشه را با استفاده از متد Delete حذف میکنیم. همین کار را
با
استفاده از کلاس DirectoryInfo نیز انجام میدهیم.
لیست کردن محتوای پوشهها
ما میتوانیم لیست فایلها، زیرپوشهها یا هر دو را از یک پوشهی مشخص به دست آوریم. متدهای
EnumerateFiles و EnumerateDirectories (و نسخههای قدیمیتر GetFiles و
GetDirectories)
برای این کار استفاده میشوند. نسخههای Enumerate کارآمدتر هستند، زیرا نتایج را به صورت
جریانی
(stream) و یکییکی برمیگردانند، به جای اینکه منتظر بمانند تا کل لیست در حافظه ساخته شود.
Program.cs
string targetDir = "C:\\Windows";
var exeFiles = Directory.EnumerateFiles(targetDir, "*.exe");
Console.WriteLine($"\nFound .exe files in {targetDir}:");
foreach (string file in exeFiles.Take(5))
{
Console.WriteLine(Path.GetFileName(file));
}
در این مثال، ما از EnumerateFiles برای پیدا کردن تمام فایلهایی که با پسوند .exe در پوشهی
ویندوز قرار دارند، استفاده کردهایم. کلاس استاتیک Path نیز ابزارهای کمکی بسیار مفیدی برای
کار
با رشتههای مسیر (مانند گرفتن نام فایل یا ترکیب مسیرها) فراهم میکند.
کار با فایلها (Files)
عملیات بر روی فایلها نیز از همان الگوی استاتیک/نمونه پیروی میکند.
Program.cs
string sourceFile = "test.txt";
string destFile = "test_copy.txt";
File.WriteAllText(sourceFile, "Hello, File System!");
if (File.Exists(sourceFile))
{
File.Copy(sourceFile, destFile, true);
Console.WriteLine("\nFile copied.");
File.Delete(sourceFile);
File.Delete(destFile);
Console.WriteLine("Files deleted.");
}
کلاس File متدهای کمکی بسیار سادهای مانند WriteAllText و ReadAllText را
برای خواندن و
نوشتن سریع فایلهای متنی کوچک فراهم میکند که در درس بعد به تفصیل به آنها خواهیم پرداخت.
کار با FileInfo
کلاس FileInfo به ما اجازه میدهد تا اطلاعات بیشتری در مورد یک فایل (فرادادهی آن) مانند
حجم،
تاریخ ایجاد و تاریخ آخرین دسترسی را به دست آوریم.
Program.cs
string filePath = "C:\\Windows\\notepad.exe";
FileInfo fileInfo = new FileInfo(filePath);
Console.WriteLine("\n--- File Info ---");
Console.WriteLine($"Name: {fileInfo.Name}");
Console.WriteLine($"Directory: {fileInfo.DirectoryName}");
Console.WriteLine($"Size: {fileInfo.Length / 1024} KB");
Console.WriteLine($"Creation Time: {fileInfo.CreationTime}");