2010-02-19 23 views
11

Tôi có một thư mục chứa quá nhiều tệp và tôi muốn xem từng tệp một. Vấn đề là Directory.GetFiles trả về một mảng hoàn thành và quá trình này mất quá nhiều thời gian.Có Directory.GetFiles trả về một tập tin tại một thời điểm? (.NET)

Tôi muốn có một đối tượng tôi trỏ đến một thư mục, sau đó gọi hàm trả về tệp tiếp theo trong thư mục. .NET có một lớp như thế này không?

(Tôi muốn tránh các điểm dừng win32, vì tôi cũng định sử dụng nó trên Mono.)

Rất cám ơn.

Trả lời

8

Bạn không thể làm điều này trong .NET 3.5, nhưng bạn có thể trong .NET 4.0, as per this blog post:

DirectoryInfo directory = new DirectoryInfo(@"\\share\symbols"); 
IEnumerable<FileInfo> files = directory.EnumerateFiles(); 
foreach (var file in files) { 
    Console.WriteLine("Name={0}, Length={1}", file.Name, file.Length); 
} 

(. Tương tự như vậy có một Directory.EnumerateFiles phương pháp tĩnh)

Tôi không biết liệu API đó đã được chuyển sang Mono chưa.

+0

chỉ là một câu hỏi, tại sao không sử dụng: var files = directory.EnumerateFiles(); ? –

+1

@ Filip: Tôi không biết về lý do của Jon, nhưng tôi sẽ sử dụng tên loại cho rõ ràng vì nó không phải là rõ ràng từ tên phương pháp loại nó trả về. –

+0

@Fredrik, có đủ rõ ràng là nó sẽ trả về một danh sách thông tin tệp đầy đủ không? Tên Phương thức thực sự tự giải thích. Cũng vậy với DirectoryInfo, tôi thích sử dụng var directory = ... Tôi biết rằng có một sự khác biệt tại thời gian biên dịch mặc dù. –

1

Hãy xem FastDirectoryEnumerator dự án trên trang web CodeProject.

Nó thực hiện chính xác những gì bạn cần và thậm chí nhiều hơn, tôi đã có thể sử dụng thành công trên mạng chia sẻ chậm với nhiều tệp và hiệu suất thật tuyệt vời.

Hạn chế - nó sử dụng interop để có thể không di chuyển sang Mono.

+0

Cảm ơn, tôi có thể kết thúc bằng cách sử dụng, nhưng rơi trở lại Directory.GetFiles nếu nó ném một ngoại lệ interop, chỉ ra rằng tôi có lẽ không phải trên win32. – billpg

+1

Bạn có thể sử dụng 'Environment.OSVersion' để xác định xem bạn có đang chạy trong Windows hay không và tìm một số mã khác sẽ hoạt động nhanh trên hệ điều hành bạn đang nhắm mục tiêu. –

Các vấn đề liên quan