2011-01-31 31 views
5

Tôi đang tìm kiếm một cách đáng tin cậy để tìm kiếm các thay đổi trong một thư mục.Cách đáng tin cậy để theo dõi các thay đổi tệp trong thư mục bằng cách sử dụng .NET framework

Tôi đã thử sử dụng FileSystemWatcher, nhưng nó không chính xác khi nhiều tệp nhỏ được tạo, thay đổi hoặc xóa. Nó bỏ lỡ khoảng 1 hoặc 2% của các tập tin trong các bài kiểm tra của tôi. Đó là khá nhiều khi bạn đang thêm hoặc thay đổi hàng ngàn tập tin nhanh chóng.

Tôi đã thử bỏ phiếu cho các thay đổi ở các khoảng thời gian khác nhau 500 ms, 2000 ms, v.v. Trong trường hợp này, tôi nhận được quá nhiều lần truy cập. Điều đó có thể có một cái gì đó để làm với độ phân giải của timestamps trên đối tượng FileInfo.

Vì vậy, câu hỏi của tôi là; là nó có thể, bằng cách sử dụng các.NET Framework, để có được những thay đổi vào một thư mục đáng tin cậy?

- Christian

Trả lời

7

Bạn đã thử tăng số InternalBufferSize chưa? Bạn đã đặt kích thước cho kích thước nào?

Từ MSDN:


Lưu ý rằng một FileSystemWatcher có thể bỏ lỡ một sự kiện khi kích thước bộ đệm là vượt quá. Để tránh các sự kiện bị thiếu, hãy thực hiện theo các nguyên tắc sau: kích thước bộ đệm bằng cách đặt thuộc tính InternalBufferSize. Tránh xem các tệp có tên tệp dài, vì tên tệp dài đóng góp để lấp đầy bộ đệm. Hãy xem xét đổi tên các tệp này bằng tên ngắn hơn .


Giữ mã xử lý sự kiện của bạn càng ngắn càng tốt.

+0

Cảm ơn bạn, điều này dường như để giải quyết vấn đề của tôi cho bây giờ. Không thể làm cho nó bỏ lỡ các tập tin với một bộ đệm 64 KB, phải chạy thêm một vài thử nghiệm để tìm các thiết lập tối ưu. –

4

Vâng, giám sát thích hợp được thực hiện sử dụng điều khiển bộ lọc hệ thống tập tin. Trình điều khiển như vậy chặn tất cả các yêu cầu đi đến hệ thống tập tin ngay khi chúng được gửi đi (trước hoặc sau khi chúng đến được hệ thống tập tin). Bằng cách này, bạn nhận được tất cả các thông báo, ngay trong thời gian (hoặc thậm chí trước khi sự kiện xảy ra) và bạn có thể kiểm soát những yêu cầu nào và thông tin nào được chuyển qua yêu cầu.

Bạn có thể tự mình viết trình điều khiển bộ lọc (~ 6-9 tháng công việc để thực hiện đúng và sau đó rất nhiều thời gian để thử nghiệm) hoặc bạn có thể sử dụng sản phẩm CallbackFilter và tránh phát triển chế độ hạt nhân. CallbackFilter cung cấp một trình điều khiển được xây dựng sẵn và các API cho .NET, VCL và native C++.

+1

Cảm ơn bạn đã đề xuất Eugene, tôi đã thực sự nhìn vào CallbackFilter của bạn trước khi nghiên cứu cho một dự án đã bị loại bỏ. Đây là một dự án sở thích vì vậy tôi cần phải giữ nó đơn giản ngay bây giờ. Nhưng sẽ ghi nhớ bạn;) –

+3

@Eugene: Câu trả lời này đã bị một số người dùng gắn cờ là spam. Tôi không tin rằng nó là, bởi vì (mặc dù không phải là một chuyên gia trong khu vực) có vẻ như sản phẩm của bạn thực sự * không * cung cấp một giải pháp cho vấn đề. Tuy nhiên, trong tương lai bạn có thể muốn xem xét việc làm cho nó rõ ràng hơn một chút rằng bạn đang quảng bá sản phẩm của riêng mình. Có lẽ một tuyên bố từ chối ở dưới cùng hoặc một cái gì đó. Và +1 để chống lại các downvotes. –

+1

@Cody Grey - cụm từ "sản phẩm ... của chúng tôi" cùng với tên người dùng cho biết nó khá rõ ràng, như đối với tôi, và điều này đã được giải quyết trước đó (cả hai được thảo luận trên Meta và thử nghiệm ở đây) và được chấp nhận. –

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