Sử dụng System.IO.Directory.GetDirectories để liệt kê thư mục.
Phương thức chính
Directory.GetDirectories(path, pattern, SearchOption): Trả vềstring[]đường dẫn thư mục.SearchOption.TopDirectoryOnly: Chỉ thư mục cấp 1.SearchOption.AllDirectories: Đệ quy tất cả cấp con.Directory.EnumerateDirectories: Trả vềIEnumerable<string>, lazy, tiết kiệm bộ nhớ.
Ví dụ 1: Chỉ thư mục cấp 1
string rootPath = @"C:\TestFolder";
string[] dirs = Directory.GetDirectories(rootPath, "*", SearchOption.TopDirectoryOnly);
foreach (string dir in dirs)
Console.WriteLine(dir);
Kết quả
C:\TestFolder\Sub1
C:\TestFolder\Sub2
C:\TestFolder\Sub3
Ví dụ 2: Đệ quy tất cả thư mục con
string[] dirs = Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories);
foreach (string dir in dirs)
Console.WriteLine(dir);
Kết quả
C:\TestFolder\Sub1
C:\TestFolder\Sub2
C:\TestFolder\Sub3
C:\TestFolder\Sub2\Sub2_1
C:\TestFolder\Sub2\Sub2_2
C:\TestFolder\Sub3\Sub3_1
Ví dụ 3: EnumerateDirectories (Khuyến nghị cho thư mục lớn)
// Lazy evaluation - không load tất cả vào RAM
foreach (string dir in Directory.EnumerateDirectories(rootPath, "*", SearchOption.AllDirectories))
{
Console.WriteLine(dir);
// Xử lý từng thư mục ngay lập tức
}
Lấy tên thư mục thay vì đường dẫn đầy đủ
foreach (string dir in Directory.GetDirectories(rootPath, "*", SearchOption.AllDirectories))
{
string name = Path.GetFileName(dir); // hoặc new DirectoryInfo(dir).Name
Console.WriteLine(name);
}
Xử lý lỗi truy cập (UnauthorizedAccessException)
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)
{
// Bỏ qua hoặc log
}
catch (PathTooLongException)
{
// Bỏ qua
}
}
Tạo cây thư mục (Tree view)
static void PrintDirectoryTree(string path, string indent = "")
{
Console.WriteLine($"{indent}{Path.GetFileName(path)}");
foreach (var dir in Directory.GetDirectories(path))
PrintDirectoryTree(dir, indent + " ");
foreach (var file in Directory.GetFiles(path))
Console.WriteLine($"{indent} {Path.GetFileName(file)}");
}