Apakah ada yang seperti inotify di Windows?

103

Dengan OS Linux, ada subsistem ionotify yang memberi tahu aplikasi tentang perubahan sistem file.

Namun, saya sebagian besar adalah pengguna Windows, jadi saya ingin tahu apakah ada cara serupa untuk memantau perubahan sistem file?

johansson
sumber
9
Saya rasa pertanyaan seperti itu tidak keluar topik. Pertanyaannya menanyakan OS API yang jauh berbeda dengan pustaka alat / perangkat lunak apa pun. Mungkin bisa dikatakan berbeda seperti bagaimana mendapatkan pemberitahuan di aplikasi windows ketika file / file tertentu diubah.
balki
1
Memilih untuk dibuka kembali: Pertanyaannya adalah menanyakan alternatif yang sebanding dengan API sistem operasi tertentu dan secara jelas berbunyi kepada saya seperti "Saya dari Inggris di mana saya menggunakan garpu untuk makan makanan, di Jepang perkakas apa yang saya gunakan dengan cara yang sama? " Jawaban yang diterima menggunakan analogi itu adalah "gunakan sumpit".
David

Jawaban:

42

Jika Anda menggunakan .net , gunakan FileSystemWatcher. Info lebih lanjut di sini: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Jika Anda menggunakan C , penggunaan FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Info lebih lanjut di sini: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

Di OSX , api yang relevan adalah fseventsapi.

Mereka semua sedikit berbeda satu sama lain, dan semuanya memiliki keandalan yang dipertanyakan dalam kasus edge. Secara umum, Anda tidak dapat bergantung pada apis ini untuk melihat secara lengkap semua perubahan 100% setiap saat. Kebanyakan orang yang menggunakan pemantauan sistem file menggabungkannya dengan pemindaian berkala untuk mengkompensasi informasi yang hilang atau tidak lengkap dari push api.

blucz
sumber
6
Bisakah Anda memberikan beberapa kutipan tentang "keandalan yang dipertanyakan dalam kasus edge untuk inotify?
Pharaun
18
Jika konsumen api pengamat fs lebih lambat dalam membaca peristiwa daripada beberapa proses lain yang menghasilkannya, kernel perlu menahan modifikasi sistem file dalam proses lain (mungkin prioritas lebih tinggi), atau memungkinkan pertumbuhan buffer yang tidak terbatas. Kedalaman buffer inotify (seperti yang didokumentasikan di halaman manual) dikontrol oleh / proc / sys / fs / inotify / max_queued_events. Selain itu, Anda mendapatkan pemberitahuan IN_Q_OVERFLOW - ini bagus, tetapi Anda masih berada dalam situasi di mana Anda mungkin perlu memindai ulang dari waktu ke waktu.
blucz
Aha benar, saya baru saja membaca tentang antrian. Saya pikir kasus tepi ini akan tergantung pada berapa banyak file yang Anda pantau dan itu juga tergantung pada apakah sangat penting untuk melacak semua perubahan atau jika beberapa dapat terlewatkan. Tapi itu poin yang bagus. Terima kasih :)
Pharaun
@blucz Saya bertanya-tanya sendiri bagaimana orang kernel memecahkan situasi ini. Senang mengetahui mereka melakukan ini, membuat orang lebih percaya diri dalam desain dan implementasi.
n611x007
11

JNotify atau FileMon dari Microsoft.

Eugene
sumber
8
JNotify sangat cocok untuk saya karena saya membutuhkan kompatibilitas lintas platform. Saya bahkan dapat menulis satu skrip bash yang berfungsi di cygwin, mac, dan linux dengan asumsi hanya JAVA_HOME yang disetel dengan benar. Ini telah menjadi bantuan besar untuk men-debug masalah pada mesin pelanggan, ketika mereka mengatakan "itu menghapus file saya!" Saya benar-benar dapat melihat log dan mencoba mencari tahu bagaimana / kapan itu terjadi.
cmyers
1
Filemon sekarang ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU
10

Agak terlambat tapi ...

Windows memiliki fasilitas yang mirip dengan acara OSX di mana Anda dapat memantau acara tanpa menjalankan aplikasi. Jurnal Windows USN melacak semua perubahan file. Jeffrey Richter (penulis Advanced Windows) menulis artikel hebat dengan contoh kerja untuk MSDN Journal. Pembaruan : artikel sekarang dari archive.org karena MSJ tidak lagi online di MS.

Dokumentasi MSDN untuk Jurnal Perubahan USN.

Jurnal Perubahan USN mungkin lebih baik jika Anda membuat aplikasi seperti alat cadangan atau indeks yang perlu memantau seluruh volume.

Peter Krnjevic
sumber
Apakah cara Jurnal USN berbeda, apakah mengandalkannya menghindari perilaku buggy FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes sedang berbicara tentang ?
n611x007
4
Sudah lama sejak saya bekerja dengan ini, tetapi tidak menggunakan FileSystemWatcher atau FindFirstChangeNotification. Saya mulai menulis pengamat acara Windows di Go, berdasarkan banyak contoh Jeffery Richter. Dari sedikit pengujian yang saya lakukan, ini sangat solid, dan tidak melewatkan apa pun, mirip dengan fsevents di OS X. Intinya ada di sini: gist.github.com/pkrnjevic/7219861
Peter Krnjevic
@PeterKrnjevic Dapatkah Anda memperbarui link untuk artikel dari Jeffrey Richter?
SOUser
@SOUser, karena MS bitrot, artikel sekarang ditautkan dari archive.org.
Peter Krnjevic
3

FileSystemWatcher () tidak dapat diandalkan terutama karena penanganan error untuk buffer pengawas kurang lebih tidak lengkap. Karena kurangnya jalur dan informasi penanganan kesalahan yang mendetail, Microsoft tidak memberi Anda cara untuk memulihkan atau memeriksa direktori kerja secara manual.

JNotify untuk Windows juga tidak dapat diandalkan karena bug ini ^ berasal dari win32. JNotify menggunakan win32. Jadi, ini tidak berbeda dengan FileSystemWatcher ().

Phillip Brandon Holmes
sumber
memikirkan tentang bagaimana merancang peran untuk menyelesaikan masalah seperti 'kecepatan' / 'balapan' / 'luapan' ini, saya bertanya-tanya sendiri bagaimana kernel melakukannya. Menarik. Hal ini juga terjadi dengan jaringan dan logging. Apakah masalah ini punya nama?
n611x007
Ya, namanya "bug". Bug (win32) telah ditinggalkan di setiap sistem operasi yang dibuat oleh Microsoft hingga saat ini. Ini membuat sistem operasi Microsoft apa pun tidak sesuai untuk solusi jenis menonton file. Anda harus pergi * nix untuk mencapainya. Terkadang saya pikir mereka sengaja membiarkan buffer ini meluap untuk alasan keamanan.
Phillip Brandon Holmes
haha .. ya .. namanya sengaja cluster kludge sehingga file system microsoft tidak bisa sengaja diawasi. Itu adalah bug yang mereka tinggalkan karena masalah keamanan.
Phillip Brandon Holmes
1

Saya melakukan sedikit pencarian, sepertinya saya ingat pernah melihat sesuatu yang mirip untuk Windows. Ada FileSystemWatcher untuk .NET. Ini terutama untuk NT atau XP dan seterusnya.

Firaun
sumber
Ini lebih umum hanya tersedia di Sistem File NTFS, tetapi tidak di FAT16, FAT32 atau bahkan exFAT baru.
Mastacheata