Có điều gì giống như inotify trên Windows không?


102

Với hệ điều hành Linux, có hệ thống con độc lập thông báo cho ứng dụng những thay đổi đối với hệ thống tệp.

Tuy nhiên, tôi chủ yếu là người dùng Windows, vì vậy tôi tự hỏi liệu có cách nào tương tự để theo dõi các thay đổi của hệ thống tệp không?


9
Tôi không nghĩ những câu hỏi như vậy là lạc đề. Câu hỏi yêu cầu một API hệ điều hành khác nhiều so với bất kỳ công cụ / phần mềm-thư viện nào. Có thể nó có thể được diễn đạt khác nhau như cách nhận thông báo trong ứng dụng windows khi tệp / tệp cụ thể được sửa đổi.
balki

1
Được bình chọn để mở lại: Câu hỏi đặt ra là yêu cầu một giải pháp thay thế có thể so sánh được với một API của hệ điều hành cụ thể và đọc cho tôi hiểu một cách hình tượng như "Tôi đến từ Anh, nơi tôi dùng nĩa để ăn thức ăn, ở Nhật tôi sử dụng dụng cụ nào theo kiểu tương tự? " Câu trả lời được chấp nhận sử dụng phép loại suy đó là "dùng đũa."
David

Câu trả lời:



42

Nếu bạn đang sử dụng .net , hãy sử dụng FileSystemWatcher. Thông tin thêm tại đây: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Nếu bạn đang sử dụng C , sử dụng FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Thông tin thêm tại đây: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

Trên OSX , api có liên quan là fseventsapi.

Tất cả chúng đều khác nhau một cách tinh tế và chúng đều có độ tin cậy đáng ngờ trong các trường hợp cạnh. Nói chung, bạn không thể phụ thuộc vào các apis này để có cái nhìn đầy đủ về tất cả các thay đổi 100% thời gian. Hầu hết mọi người sử dụng giám sát hệ thống tệp kết hợp nó với việc quét định kỳ để bù đắp thông tin bị mất hoặc không đầy đủ từ api đẩy.


6
Bạn có thể xin vui lòng cho một số trích dẫn về "độ tin cậy đáng ngờ trong trường hợp cạnh cho inotify?
Pharaun

18
Nếu người dùng api fs watcher đọc các sự kiện chậm hơn so với một số quy trình khác đang tạo chúng, thì hạt nhân cần phải giữ các sửa đổi hệ thống tệp trong quy trình khác (có thể có mức ưu tiên cao hơn) hoặc cho phép bộ đệm phát triển không giới hạn. Độ sâu bộ đệm của inotify (như được ghi trong trang người đàn ông) được điều khiển bởi / proc / sys / fs / inotify / max_queued_events. Ngoài ra, bạn sẽ nhận được thông báo IN_Q_OVERFLOW - điều này là tốt, nhưng bạn vẫn ở trong tình huống thỉnh thoảng cần quét lại.
blucz

Aha đúng, gần đây tôi đã đọc lên hàng đợi. Tôi nghĩ rằng trường hợp cạnh này sẽ phụ thuộc vào số lượng tệp bạn đang theo dõi và nó cũng phụ thuộc vào việc nó có quan trọng để theo dõi tất cả các thay đổi hay không hoặc nếu một vài tệp có thể bị bỏ sót. Nhưng đó là một điểm tốt. Cảm ơn :)
Pharaun

@blucz Tôi đã tự hỏi bản thân mình làm thế nào để nhân viên giải quyết những tình huống này. Thật tốt khi biết họ làm điều này, khiến người ta tự tin hơn trong việc thiết kế và thực hiện.
n611x007


11

JNotify hoặc FileMon của Microsoft.


8
JNotify hoàn toàn phù hợp với tôi vì tôi cần khả năng tương thích đa nền tảng. Tôi thậm chí có thể viết một tập lệnh bash duy nhất hoạt động trong cygwin, mac và linux chỉ có thể cho rằng JAVA_HOME được đặt chính xác. Đây là một trợ giúp tuyệt vời cho việc gỡ lỗi các sự cố trên máy của khách hàng, khi họ nói "nó đã xóa tệp của tôi!" Tôi thực sự có thể nhìn vào nhật ký và cố gắng tìm ra cách thức / thời điểm điều đó xảy ra.
cmyers

1
FileMon hiện là ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU

10

Hơi muộn nhưng ...

Windows có một cơ sở tương tự như các sự kiện OSX, nhờ đó bạn có thể theo dõi các sự kiện mà không cần chạy ứng dụng. Windows USN Journal theo dõi tất cả các thay đổi của tệp. Jeffrey Richter (tác giả của Advanced Windows) đã viết một bài báo tuyệt vời với các mẫu làm việc cho MSDN Journal. Cập nhật : bài viết bây giờ từ archive.org vì MSJ không còn trực tuyến tại MS.

Tài liệu MSDN cho USN Change Journals.

USN Change Journals có lẽ tốt hơn nếu bạn đang xây dựng các ứng dụng như công cụ sao lưu hoặc chỉ mục cần theo dõi toàn bộ khối lượng.


USN Journal có khác biệt không, dựa vào đó có tránh được hành vi lỗi của FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes đang nói đến ?
n611x007.

4
Đã lâu kể từ khi tôi làm việc với điều này, nhưng nó không sử dụng FileSystemWatcher hoặc FindFirstChangeNotification. Tôi bắt đầu viết một trình theo dõi sự kiện của Windows trong Go, dựa nhiều vào các ví dụ của Jeffery Richter. Từ chút thử nghiệm tôi đã làm, đó là đá rắn, và nhớ gì cả, tương tự như fsevents trong OS X. Gist là ở đây: gist.github.com/pkrnjevic/7219861
Peter Krnjevic

@PeterKrnjevic Bạn có thể cập nhật liên kết cho bài viết từ Jeffrey Richter không?
SOUser

@SOUser, do MS bitrot, bài viết hiện được liên kết từ archive.org.
Peter Krnjevic

3

FileSystemWatcher () không đáng tin cậy chủ yếu là do việc xử lý lỗi đối với bộ đệm người xem ít nhiều chưa hoàn thiện. Do thiếu đường dẫn và thông tin xử lý lỗi chi tiết, Microsoft không cung cấp cho bạn cách nào để khôi phục hoặc thăm dò thủ công thư mục làm việc.

JNotify cho Windows cũng không đáng tin cậy vì lỗi này ^ bắt nguồn từ win32. JNotify sử dụng win32. Vì vậy, nó không khác gì FileSystemWatcher ().


suy nghĩ về cách thiết kế các vai trò để giải quyết vấn đề giống như 'tốc độ' / 'cuộc đua' / 'tràn' này, tôi tự hỏi bản thân mình làm thế nào các hạt nhân đã làm được điều đó. Hấp dẫn. Điều này cũng xảy ra với mạng và ghi nhật ký. Vấn đề này có tên không?
n611x007.

Có, nó tên là "lỗi". Lỗi (win32) vẫn còn trong mọi hệ điều hành do Microsoft tạo ra cho đến nay. Điều này khiến bất kỳ hệ điều hành nào của Microsoft không phù hợp với giải pháp loại xem tệp. Bạn phải đi * nix để hoàn thành nó. Đôi khi tôi nghĩ rằng họ đã cố tình để bộ đệm này tràn vào vì lý do bảo mật.
Phillip Brandon Holmes

haha .. yeah .. nó là tên của cụm có chủ ý để hệ thống tệp của microsoft không thể bị theo dõi một cách có chủ ý. Đó là một lỗi mà họ để lại do lo ngại về bảo mật.
Phillip Brandon Holmes

1

Tôi đã tìm kiếm một chút, dường như tôi nhớ lại đã thấy một thứ gì đó tương tự cho Windows. Có FileSystemWatcher cho .NET. Nó chủ yếu dành cho NT hoặc XP và chuyển tiếp.


Nói chung, nó chỉ khả dụng trên Hệ thống tập tin NTFS, nhưng không khả dụng trên FAT16, FAT32 hoặc thậm chí là exFAT mới.
Mastacheata

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.