Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีดึง Directory และ Subdirectories ทั้งหมดใน Path ด้วย C#

ใช้คลาส System.IO.Directory เมธอด GetDirectories และ EnumerateDirectories

เมธอดหลัก

  • Directory.GetDirectories(path, pattern, SearchOption): คืน string[] (โหลดทั้งหมดใน Memory)
  • Directory.EnumerateDirectories(path, pattern, SearchOption): คืน IEnumerable<string> (Lazy, Memory Efficient)
  • SearchOption.TopDirectoryOnly: เฉพาะโฟลเดอร์ระดับบน
  • SearchOption.AllDirectories: รวม Subdirectories ทั้งหมด (Recursive)

ตัวอย่าง 1: GetDirectories (Eager Loading)

using System;
using System.IO;

static void Main()
{
    string rootPath = @"C:\TestFolder";
    
    // เฉพาะ Top Directory
    string[] topDirs = Directory.GetDirectories(rootPath, "*", SearchOption.TopDirectoryOnly);
    Console.WriteLine("=== Top Directories ===");
    foreach (var dir in topDirs) Console.WriteLine(dir);
    
    // ทุก Subdirectories
    string[] allDirs = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories);
    Console.WriteLine("\n=== All Directories (Recursive) ===");
    foreach (var dir in allDirs) Console.WriteLine(dir);
}

ผลลัพธ์ตัวอย่าง

=== Top Directories ===
C:\TestFolder\ProjectA
C:\TestFolder\ProjectB
C:\TestFolder\Docs

=== All Directories (Recursive) ===
C:\TestFolder\ProjectA
C:\TestFolder\ProjectA\Src
C:\TestFolder\ProjectA\Tests
C:\TestFolder\ProjectB
C:\TestFolder\Docs
C:\TestFolder\Docs\Archive

ตัวอย่าง 2: EnumerateDirectories (Lazy - แนะนำสำหรับโฟลเดอร์ใหญ่)

static void Main()
{
    string rootPath = @"C:\TestFolder";
    
    // Lazy Evaluation - Process ทีละอัน
    foreach (string dir in Directory.EnumerateDirectories(rootPath, "*", SearchOption.AllDirectories))
    {
        Console.WriteLine(dir);
        // หากต้องการหยุดก่อนครบ: break; (ประหยัด Memory/Time)
    }
}

ตัวอย่าง 3: กรองด้วย LINQ

var recentDirs = Directory.EnumerateDirectories(rootPath, "*", SearchOption.AllDirectories)
    .Select(d => new DirectoryInfo(d))
    .Where(di => di.CreationTime > DateTime.Now.AddDays(-7))
    .OrderByDescending(di => di.CreationTime)
    .Select(di => di.FullName);

foreach (var dir in recentDirs)
    Console.WriteLine($"Recent: {dir}");

ตัวอย่าง 4: ข้อมูลละเอียดด้วย DirectoryInfo

var root = new DirectoryInfo(rootPath);
var allDirs = root.GetDirectories("*", SearchOption.AllDirectories);

foreach (var dir in allDirs)
{
    Console.WriteLine($"Name: {dir.Name}");
    Console.WriteLine($"Full Path: {dir.FullName}");
    Console.WriteLine($"Created: {dir.CreationTime}");
    Console.WriteLine($"Attributes: {dir.Attributes}");
    Console.WriteLine($"Parent: {dir.Parent?.Name}");
    Console.WriteLine("---");
}

ข้อควรระวัง

  • UnauthorizedAccessException: ไม่มีสิทธิ์เข้าถึงโฟลเดอร์ → Try/Catch หรือใช้ Enumerate กับ Handle Error
  • PathTooLongException: Path > 260 Chars → .NET Core 3.0+ รองรับ Long Paths อัตโนมัติ (ต้อง config ใน app.manifest)
  • Performance: EnumerateDirectories เร็วกว่าและประหยัด Memory สำหรับโฟลเดอร์ใหญ่
  • Pattern: "*" = ทั้งหมด, "Project*" = เริ่มต้นด้วย Project

Error Handling Pattern สำหรับ Enumerate

public static IEnumerable<string> SafeEnumerateDirectories(string path, string pattern, SearchOption option)
{
    try
    {
        foreach (var dir in Directory.EnumerateDirectories(path, pattern, option))
            yield return dir;
    }
    catch (UnauthorizedAccessException)
    {
        // Log หรือ Skip
    }
    catch (PathTooLongException)
    {
        // Handle
    }
}