2013-05-13 22 views
5

Tôi gặp sự cố. Tôi đã viết một trình bao bọc trên FileSystemWatcher phát hiện các thay đổi trong thư mục gốc và tất cả các thư mục con của nó. Không có gì lạ mắt:FileSystemWatcher dưới chế độ xem đơn lẻ

FileSystemWatcher watcher = new FileSystemWatcher(); 
watcher.Path = this.Root; 
watcher.IncludeSubdirectories = true; 
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.DirectoryName | NotifyFilters.FileName; 
watcher.Changed += new FileSystemEventHandler (watcher_Changed); 
watcher.Deleted += new FileSystemEventHandler (watcher_Deleted); 
watcher.Created += new FileSystemEventHandler (watcher_Created); 
watcher.Renamed += new RenamedEventHandler (watcher_Renamed); 
watcher.EnableRaisingEvents = true; 

Khi ở trong .NET, dưới Windows, nó hoạt động như một nét duyên dáng. Nhưng khi tôi chuyển mã sang mono và chạy mã trong OSX, nó chỉ hoạt động đúng trong thư mục gốc.

vấn đề tôi đã nhận thấy bây giờ:

  • Sự kiện được không huy động cho các hoạt động trong thư mục đã tồn tại dưới gốc tại thời điểm quan sát bắt đầu

  • Paths tôi nhận được qua EventArgs.FullPath tài sản là không đúng (khi tôi sao chép một tập tin vào path_to_root/some/more/subdirs/some.file, đường dẫn tôi nhận được chỉ là path_to_root/some.file).

Vấn đề với đường dẫn unproper đã được đã báo cáo một năm trước (và có vẻ như nó đã được giải quyết) nhưng mono của tôi xuất phát từ ngày năm ngoái (MonoDevelop nói trong phần Tài liệu tham khảo đó là phiên bản 4.0.0.0, nó là tất cả những gì tôi có thể nói về phân phối) và các lỗi vẫn còn đó ... Xem: https://bugzilla.xamarin.com/show_bug.cgi?id=5747

Bất kỳ ý tưởng nào? Tôi thực sự tò mò nếu có một cách giải quyết khác không yêu cầu người xem phải tự kiểm tra hệ thống tệp nhiều lần hoặc bắt đầu trình xem riêng cho mỗi thư mục dưới gốc ...

Cảm ơn bạn trước!

+0

Có thể, điều này có thể giúp: [không-net-FileSystemWatcher-việc-với-mono-on-mac-os] [1] [1]: http://stackoverflow.com/ Câu hỏi/5727652/does-net-filesystemwatcher-work-với-mono-on-mac-os –

+0

Thấy chủ đề này, rất tiếc là tôi không thể tìm thấy bất kỳ trợ giúp nào cho chính mình ở đó ... Cảm ơn, mặc dù! – wojtuch

+0

nếu sửa lỗi cho 5747 không khắc phục được tình huống của bạn, bạn chỉ cần tạo một lỗi mới khác trong http://bugzilla.xamarin.com – knocte

Trả lời

5

Theo như tôi có thể nói, đây chỉ đơn giản là không hoạt động trong Mono trên OS X. tôi gặp nó tuần trước và không thể tìm thấy bất kỳ báo cáo lỗi cho nó, vì vậy tôi đã báo cáo nó tại đây: https://bugzilla.xamarin.com/show_bug.cgi?id=16259

As far vì tôi có thể theo dõi implementation of KEventWatcher, nó không làm bất cứ điều gì để đăng ký các thư mục con khi người xem được tạo. Tôi nghĩ rằng thời gian duy nhất nó đăng ký vào thư mục con là khi nó phát hiện chúng được thêm vào trong PostEvent. Ngay cả khi nó đã đăng ký tất cả các thư mục con khi tạo, nó có thể không phải là một giải pháp tuyệt vời. Cơ chế Kevent cơ bản sẽ yêu cầu một bộ mô tả tập tin mở cho mỗi thư mục con, điều này có thể kết thúc là một bộ mô tả tập tin khủng khiếp.

Mono không có triển khai khác của FileSystemWatcher, nhưng tôi tin rằng việc lựa chọn triển khai được đưa vào thời gian chạy Mono khi được biên dịch. Có trình theo dõi mặc định chậm và không hiệu quả hoạt động trên tất cả các nền tảng bằng cách chỉ cần quét toàn bộ cây thư mục sau mỗi giây, nhưng chỉ được chọn nếu không có triển khai nền tảng cụ thể.

Tôi sợ phải nói, có vẻ như đặt cược tốt nhất của bạn là một trong những giải pháp bạn đề xuất - quét các thay đổi theo cách thủ công hoặc tạo FileSystemWatcher cho mỗi thư mục.

+0

mà không cần phải chi tiết sâu vào chi tiết bạn đã mô tả, tôi quyết định viết "watcher" của riêng mình - Tôi chỉ đơn giản là thăm dò các hệ thống tập tin và phát hiện các mục thay đổi bằng tay - một chút chi phí nhưng cũng ... điều quan trọng nhất tôi học được từ việc chuyển chương trình Windows sang MacOS - tìm hiểu Mục tiêu C hoặc thuê ai đó có thể. Nó sẽ giúp bạn tránh đau đầu khi bạn khám phá một tính năng khác không được triển khai/không hoạt động, ví dụ: phát hiện trạng thái mạng, thay đổi công suất, v.v. – wojtuch