ใช้คลาส 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 ErrorPathTooLongException: 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
}
}