2012-01-06 30 views
6

Tôi đang cố gắng theo dõi các tệp được sao chép bởi người dùng và các ứng dụng khác. FileSystemWatch chỉ có các sự kiện cho Đã thay đổi, Đã tạo, Đã xóa, Đã xử lý, Lỗi và Được đổi tên. Nó không kích hoạt sự kiện khi một tệp được truy cập bởi hàm sao chép hoặc nơi tệp mới được sao chép vào.C# Theo dõi các tệp được sao chép

Có phương pháp giám sát sự kiện/chức năng sao chép của cửa sổ không?

+0

Bạn có thể xem bản sao của khay nhớ tạm để thay thế không? Chỉ là một ý nghĩ. http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.aspx –

+0

Bạn có thể chịu đựng được sự thất bại khi theo dõi một bản sao như thế nào? Có thể bạn có thể theo dõi các bản sao _most_ (ví dụ: các bản sao được thực hiện thông qua Explorer), nhưng một số sẽ trượt qua. –

+0

Tại sao bạn lại cố gắng thực hiện việc này? – RQDQ

Trả lời

4

Tôi không biết cách nào bằng C#.

Bạn có thể thực hiện việc này nếu bạn sẵn sàng viết File System Filter Driver. [Lãnh thổ Chắc chắn chuyên gia, là có phạm vi làm hư hỏng tập tin và/hoặc phá hỏng hệ thống của bạn] chặn tài xế

Một hệ thống tập tin lọc yêu cầu nhắm vào một hệ thống tập tin này hay cách khác tệp trình điều khiển hệ thống lọc. Bằng cách chặn yêu cầu trước khi đạt được mục tiêu dự định, trình điều khiển bộ lọc có thể mở rộng hoặc thay thế chức năng được cung cấp bởi mục tiêu ban đầu của yêu cầu . Ví dụ về trình điều khiển bộ lọc hệ thống tệp bao gồm bộ lọc chống vi-rút , tác nhân sao lưu và sản phẩm mã hóa. Để phát triển file các trình điều khiển hệ thống tập tin và hệ thống tập tin, sử dụng Bộ IFS (Bộ tập tin có thể cài đặt ), được cung cấp kèm theo Bộ điều khiển Windows (WDK).

+1

Trình điều khiển bộ lọc có thể theo dõi hoạt động đọc và ghi riêng biệt nhưng không thể thiết lập liên kết giữa hai. Không thể xác định việc sao chép theo cách xác định. –

1

Bạn đang làm điều đúng với FileSystemWatcher. Windows không có bất kỳ cơ chế tích hợp nào để báo cáo các bản sao một cách đáng tin cậy.

Bạn có thể treo thường trình sao chép hệ điều hành, nhưng điều này sẽ không đảm bảo cho bạn kết quả tốt: ứng dụng được tự do triển khai bản sao của riêng mình bằng cách chỉ mở tệp nguồn và đích và sao chép byte.

Đổi tên khác nhau vì việc đổi tên được thực hiện bởi hệ điều hành không thể dễ dàng bắt chước thông qua các phương tiện khác, vì vậy bạn sẽ bắt được tất cả đổi tên bằng FileSystemWatcher. Lưu ý rằng việc di chuyển giữa các ổ đĩa giống như bản sao: bạn sẽ không nhận được thông báo được Đổi tên, nhưng thay vào đó là Tạo và Xóa.

Vì vậy, nếu bạn thực sự thực sự cần phải nhận thấy một tập tin bị sao chép, cách tiếp cận đề nghị của tôi là thế này:

  • Hook các CloseFile cuộc gọi, ngoài các FileSystemWatcher.
  • Bất cứ khi nào tệp bị đóng, có thể là do đó là nguồn hoặc mục tiêu của di chuyển sao chép/chuyển ổ đĩa chéo. Kiểm tra kích thước của nó.
  • Nếu bạn tìm thấy hai tệp đã đóng có cùng kích thước trong một khoảng thời gian hợp lý, hãy so sánh nội dung. Khá tốn nhiều tài nguyên, nhưng cách đáng tin cậy duy nhất để làm điều này.
0

Bạn có thể sử dụng Auditing file and folder access tính năng của Windows mà viết một entry bản ghi sự kiện và bạn có thể thiết lập chương trình để bắt đầu khi một sự kiện như vậy xảy ra

0

Tôi không thể nghĩ ra cách nào tốt.

Đối với mỗi tệp mới được tạo, bạn cần kiểm tra xem có bản sao chính xác (có thể có tên khác) ở bất kỳ đâu trên hệ thống tệp hay không. Bạn rõ ràng có thể làm điều này brute-lực, nhưng giải pháp sẽ rất không thích hợp, chậm và giòn!

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