Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Lấy tất cả thư mục và thư mục con trong đường dẫn C#

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