2012-12-31 33 views
8

Thứ tự đọc mặc định cho phương thức Directory.EnumerateFiles là gì? Nó có nhất quán không?Directory.EnumerateFiles read order (C#)

Theo kinh nghiệm của tôi cho đến nay, có vẻ như vào ngày tệp được tạo nhưng tôi chưa thể tìm thấy xác nhận về điều này.

Lý do tôi hỏi là vì một phần của chương trình tôi đang làm việc trên các tệp tải nhị phân từ các thư mục vào các đối tượng được tải vào các mảng. Các đối tượng này tham chiếu lẫn nhau bằng các mảng chỉ mục, có nghĩa là thứ tự chúng được nạp vào các mảng của chúng cần duy trì tính nhất quán (để tránh các chỉ số dịch chuyển).

Khi tôi ở đây, tôi có một câu hỏi nhỏ khác. Khi các tập tin bị xóa, nó rõ ràng là thay đổi chỉ số của các tập tin được nạp vào mảng bất kể tôi làm gì. Bất kỳ đề xuất nào để tránh sự cố này? Tôi đã tránh sử dụng từ điển cho đến bây giờ do lo lắng về việc lưu trữ (thay vì không lưu trữ các mảng của các phím văn bản nếu tôi có thể tránh được nó), nhưng nếu đó là cách tiếp cận khả thi duy nhất, tôi có thể phải thực hiện nó.


EDIT: Sau những lời khuyên tuyệt vời từ câu trả lời của bạn, tôi đã refactored đến một cách tiếp cận từ điển bằng cách sử dụng tên của các tập tin. Tác động hiệu suất đã được khá không đáng kể và khả năng đọc và bảo trì được cải thiện rất nhiều vì vậy nó làm việc ra khá tốt.

+0

Tại sao không chỉ giữ tham chiếu thay vì chỉ mục? Bạn sẽ không phải lo lắng về các chỉ mục bị xáo trộn nếu bạn đã làm điều này. – casperOne

+0

Do cách thức hoạt động của tệp tuần tự. Nếu tôi đã lưu các tập tin có chứa tài liệu tham khảo thông qua serialization và sau đó tải các tập tin, tôi sẽ được tải toàn bộ cây đối tượng mỗi khi kết quả sao chép hàng loạt. Ví dụ, nếu xe tham chiếu lốp xe và tài liệu tham khảo lốp xe và cả hai đều được lưu và sau đó nạp, tôi sẽ có 2 trường hợp trùng lặp của lốp. – Djentleman

+2

Lấy từ [MSDN] (http://msdn.microsoft.com/en-us/library/07wt70x2.aspx), về 'GetFiles' (về cơ bản gọi là' EnumerateFiles'): * Thứ tự của tên tệp được trả về là không được bảo đảm; sử dụng phương thức Sort() nếu cần một thứ tự sắp xếp cụ thể. * Tôi đề nghị bạn, như tài liệu nói, để sử dụng phương pháp phân loại của riêng bạn. – Mir

Trả lời

10

Theo như tôi có thể biết, nó không được ghi lại - do đó ngay cả khi bạn có thể phát hiện mẫu, bạn không nên dựa vào mẫu đó. Nó có thể phụ thuộc vào phiên bản .NET, hoặc phiên bản của hệ điều hành, hoặc đơn giản là thay đổi giữa các gói dịch vụ. Thay vào đó, nếu bạn cần một số thứ tự cụ thể, bạn nên tự mình sắp xếp nó. Tất nhiên là không may là yêu cầu tìm tất cả các tên tập tin trước khi xử lý chúng, nhưng nó sẽ cho bạn sự nhất quán.

Thành thật mà nói, có vẻ như bạn đã có một mô hình dữ liệu rất mong manh. Bạn đã không thực sự nói với chúng tôi đủ về những gì bạn đang làm để sửa nó, nhưng sử dụng chỉ số nguyên của một tệp trong kết quả của Directory.EnumerateFileschắc chắn không phải là cách tiếp cận tốt nhất.

Nếu bạn sử dụng tệp tên thay vì chỉ mục, điều đó sẽ cho phép bạn xử lý tệp khi bạn đọc chúng, có khả năng - nhưng cũng có thể có cách tiếp cận tốt hơn, tùy thuộc vào những gì bạn đang cố gắng làm. Sử dụng tên vẫn phải là hợp lý giá rẻ - nó sẽ chỉ là một tham chiếu chuỗi duy nhất thay vì một số nguyên, và thậm chí nếu nó được sử dụng ở nhiều nơi, nó sẽ là một số tham chiếu đến cùng một đối tượng chuỗi.

4

Tài liệu không chỉ định thứ tự, nhưng bạn luôn có thể buộc thứ tự bạn muốn bằng cách sử dụng chức năng OrderBy của LINQ.

Bạn có thể bỏ qua thay đổi chỉ mục bằng cách xóa tham chiếu đến null, thay vì thực sự xóa các mục khỏi mảng. Sự cân bằng ở đây là bây giờ bạn phải kiểm tra xem mặt hàng tại chỉ mục đã cho là null.

Nếu bạn có cấu trúc dữ liệu dễ đọc hơn dựa trên Dictionary, hãy xem xét chuyển sang nó và bỏ qua các mối quan tâm về hiệu suất cho đến khi trình lược tả của bạn cho bạn biết rằng bạn phải tối ưu hóa phần cụ thể này của mã.

13

API Win32 cơ bản được .NET sử dụng là FindFirstFileFindNextFile.documentation specifically states:

Thứ tự mà hàm này trả về tên tệp phụ thuộc vào loại hệ thống tệp. Với hệ thống tệp NTFS và hệ thống tệp CDFS, tên thường được trả về theo thứ tự bảng chữ cái. Với hệ thống tệp FAT, tên thường được trả về theo thứ tự các tệp được ghi vào đĩa, có thể hoặc không theo thứ tự bảng chữ cái. Tuy nhiên, như đã nêu trước đây, những hành vi này không được bảo đảm.

Vì vậy, không, bạn không thể đảm bảo thứ tự các tệp được trả về. Các câu trả lời khác cung cấp đủ cách để giải quyết hành vi này.

+0

Cảm ơn. Hữu ích! – Shimmy

+0

Tôi thích chi tiết kỹ thuật này và liên kết. – Gqqnbig