Phương thức Directory.EnumerateFiles() trả về IEnumerable<string> chứa đường dẫn các file, thực thi lười (lazy) - chỉ đọc khi duyệt, tiết kiệm bộ nhớ so với GetFiles() (trả về mảng, eager).
Cú pháp
Directory.EnumerateFiles(path, searchPattern, SearchOption.AllDirectories)
Ví dụ: Đệ quy tất cả file
foreach (string file in Directory.EnumerateFiles(@"D:\NEW", "*.*", SearchOption.AllDirectories))
{
Console.WriteLine(file);
}
Mã nguồn hoàn chỉnh
using System;
using System.IO;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
foreach (string allFiles in Directory.EnumerateFiles(@"D:\NEW", "*.*", SearchOption.AllDirectories))
{
Console.WriteLine(allFiles);
}
}
}
}
Kết quả (ví dụ)
D:\NEW\my.txt
D:\NEW\amit.html
D:\NEW\tutorials\java\a.java
EnumerateFiles vs GetFiles
| Đặc điểm | EnumerateFiles | GetFiles |
|---|---|---|
| Trả về | IEnumerable<string> | string[] |
| Thực thi | Lazy (lười) | Eager (ngay lập tức) |
| Bộ nhớ | Tiết kiệm (streaming) | Cấp phát toàn bộ mảng |
| Phù hợp | Thư mục lớn, nhiều file | Thư mục nhỏ, cần mảng |
| Exception | Ném khi duyệt (deferred) | Ném ngay khi gọi |
SearchOption
SearchOption.TopDirectoryOnly // Chỉ thư mục hiện tại (mặc định)
SearchOption.AllDirectories // Đệ quy tất cả thư mục con
Search Pattern
"*.*" // Tất cả file
"*.txt" // Chỉ .txt
"report_?.pdf" // report_1.pdf, report_A.pdf (ký tự đơn ?)
"data_[0-9].csv" // Không hỗ trợ regex, chỉ wildcard * ?
Lưu ý
EnumerateFilesnémUnauthorizedAccessExceptionkhi duyệt vào thư mục không có quyền - cần try-catch trong vòng lặp.- Kết hợp với
EnumerateDirectoriesđể duyệt cây thư mục tùy chỉnh. - .NET Core / .NET 5+: hỗ trợ
EnumerationOptionscho kiểm soát chi tiết hơn (bỏ qua hidden, symlink, v.v.).