مقدمه

به فصل نوزدهم خوش آمدید. تقریباً تمام برنامه‌های کاربردی در دنیای واقعی، در مقطعی نیاز به تعامل با سیستم فایل (File System) دارند. این تعامل می‌تواند شامل خواندن و نوشتن داده در فایل‌ها، ایجاد و حذف پوشه‌ها، یا جستجو برای پیدا کردن فایل‌های خاص باشد. فریم‌ورک .NET یک API بسیار غنی و قدرتمند را در فضای نام System.IO برای کار با فایل‌ها و پوشه‌ها فراهم کرده است.

در این درس، با کلاس‌های اصلی این فضای نام آشنا می‌شویم و یاد می‌گیریم که چگونه اطلاعات مربوط به درایوها، پوشه‌ها و فایل‌ها را به دست آوریم، آن‌ها را ایجاد، کپی، جابجا و حذف کنیم. این درس، پایه‌ی اصلی برای درک نحوه‌ی خواندن و نوشتن داده‌هاست که در درس‌های بعدی به آن خواهیم پرداخت.

کلاس‌های استاتیک در مقابل کلاس‌های نمونه

API فضای نام System.IO برای کار با فایل‌ها و پوشه‌ها، دو رویکرد موازی را ارائه می‌دهد: استفاده از کلاس‌های استاتیک و استفاده از کلاس‌های نمونه (instance).

  • کلاس‌های استاتیک (Directory, File): این کلاس‌ها مجموعه‌ای از متدهای استاتیک را برای انجام عملیات بر روی فایل‌ها و پوشه‌ها فراهم می‌کنند. شما برای استفاده از آن‌ها نیازی به ساختن نمونه ندارید و مسیر فایل یا پوشه را به عنوان یک رشته به متدها پاس می‌دهید. این روش برای انجام یک یا دو عملیات سریع و ساده بسیار مناسب است.
  • کلاس‌های نمونه (DirectoryInfo, FileInfo): این کلاس‌ها نمایانگر یک پوشه یا فایل خاص هستند. شما ابتدا یک نمونه از آن‌ها را با دادن مسیر می‌سازید و سپس متدهای نمونه را بر روی آن شیء فراخوانی می‌کنید. این روش زمانی کارآمدتر است که بخواهید چندین عملیات را بر روی یک فایل یا پوشه‌ی واحد انجام دهید، زیرا سیستم‌عامل برخی از اطلاعات امنیتی و وضعیتی را کش (cache) می‌کند.

کار با پوشه‌ها (Directories)

بیایید با استفاده از هر دو رویکرد، عملیات رایج بر روی پوشه‌ها را بررسی کنیم.

ایجاد و حذف پوشه‌ها

برای ایجاد و حذف پوشه‌ها، می‌توانیم از کلاس استاتیک Directory و یا کلاس نمونه DirectoryInfo استفاده کنیم. در مثال زیر، نحوه‌ی انجام این کار را با هر دو روش نشان داده‌ایم:

Copy Icon Program.cs
using System.IO;

// --- Using static Directory class ---
string staticPath = "C:\\MyStaticFolder";
Directory.CreateDirectory(staticPath);
if (Directory.Exists(staticPath))
{
    Directory.Delete(staticPath);
    Console.WriteLine("Static folder deleted.");
}

// --- Using instance-based DirectoryInfo class ---
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) و یکی‌یکی برمی‌گردانند، به جای اینکه منتظر بمانند تا کل لیست در حافظه ساخته شود.

Copy Icon Program.cs
string targetDir = "C:\\Windows";

// Get all .exe files from the Windows directory.
var exeFiles = Directory.EnumerateFiles(targetDir, "*.exe");

Console.WriteLine($"\nFound .exe files in {targetDir}:");
foreach (string file in exeFiles.Take(5)) // Just take the first 5
{
    Console.WriteLine(Path.GetFileName(file));
}

در این مثال، ما از EnumerateFiles برای پیدا کردن تمام فایل‌هایی که با پسوند .exe در پوشه‌ی ویندوز قرار دارند، استفاده کرده‌ایم. کلاس استاتیک Path نیز ابزارهای کمکی بسیار مفیدی برای کار با رشته‌های مسیر (مانند گرفتن نام فایل یا ترکیب مسیرها) فراهم می‌کند.

کار با فایل‌ها (Files)

عملیات بر روی فایل‌ها نیز از همان الگوی استاتیک/نمونه پیروی می‌کند.

Copy Icon Program.cs
string sourceFile = "test.txt";
string destFile = "test_copy.txt";

// Create a file and write some text to it.
File.WriteAllText(sourceFile, "Hello, File System!");

// Check if the source file exists.
if (File.Exists(sourceFile))
{
    // Copy the file.
    File.Copy(sourceFile, destFile, true); // The 'true' allows overwriting.
    Console.WriteLine("\nFile copied.");
    
    // Delete both files.
    File.Delete(sourceFile);
    File.Delete(destFile);
    Console.WriteLine("Files deleted.");
}

کلاس File متدهای کمکی بسیار ساده‌ای مانند WriteAllText و ReadAllText را برای خواندن و نوشتن سریع فایل‌های متنی کوچک فراهم می‌کند که در درس بعد به تفصیل به آن‌ها خواهیم پرداخت.

کار با FileInfo

کلاس FileInfo به ما اجازه می‌دهد تا اطلاعات بیشتری در مورد یک فایل (فراداده‌ی آن) مانند حجم، تاریخ ایجاد و تاریخ آخرین دسترسی را به دست آوریم.

Copy Icon 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}");