Windows'ta inotify gibi bir şey var mı?


103

Linux işletim sistemi ile, dosya sistemindeki değişiklikleri bir uygulamaya bildiren ionotify alt sistemi vardır.

Bununla birlikte, çoğunlukla bir Windows kullanıcısıyım, bu yüzden dosya sistemi değişikliklerini izlemenin benzer bir yolu olup olmadığını merak ediyordum.


9
Bu tür soruların konu dışı olmadığını düşünüyorum. Soru, herhangi bir araç / yazılım kitaplığından çok farklı olan bir işletim sistemi API'sini sorar. Belirli dosya / dosyalar değiştirildiğinde bir Windows uygulamasında nasıl bildirim alınacağı gibi farklı bir şekilde ifade edilebilir.
balki

1
Yeniden açılmak için oy verildi: Soru, belirli bir işletim sistemi API'sine karşılaştırılabilir bir alternatif istiyor ve bana mecazi olarak şöyle diyor: "Yemek yemek için çatal kullandığım İngiltere'denim, Japonya'da benzer şekilde hangi kapları kullanıyorum? " Bu benzetmeyi kullanarak kabul edilen yanıt "çubuk kullan" tır.
David

Yanıtlar:



42

.Net kullanıyorsanız , kullanın FileSystemWatcher. Daha fazla bilgi burada: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Eğer kullanıyorsanız C , kullanımı FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Daha fazla bilgi burada: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

On OSX , ilgili API olduğunu fseventsapi.

Hepsi birbirinden ince bir şekilde farklıdır ve hepsi uç durumlarda şüpheli güvenilirliğe sahiptir. Genel olarak, zamanın% 100'ünde tüm değişikliklerin eksiksiz bir görünümü için bu API'lere güvenemezsiniz. Dosya sistemi izleme kullanan çoğu kişi, push api'den gelen kayıp veya eksik bilgileri telafi etmek için bunu periyodik taramalarla birleştirir.


6
"Son durumda
inotify

18
Bir fs watcher api'sinin bir tüketicisi olayları okumada başka bir işlemin üretmekte olduğundan daha yavaşsa, çekirdeğin ya diğer (muhtemelen daha yüksek öncelikli) işlemdeki dosya sistemi değişikliklerini tutması ya da arabelleğin sınırsız büyümesine izin vermesi gerekir. inotify'ın arabellek derinliği (kılavuz sayfasında belgelendiği gibi) / proc / sys / fs / inotify / max_queued_events tarafından kontrol edilir. Bunun ötesinde bir IN_Q_OVERFLOW bildirimi alırsınız - bu iyidir, ancak yine de zaman zaman yeniden taramanız gerekebilecek bir durumda kalırsınız.
blucz

Aha doğru, son zamanlarda kuyrukta okuyordum. Bence bu uç durum, kaç dosyayı izlediğinize bağlı olacak ve aynı zamanda tüm değişiklikleri izlemenin kritik olup olmadığına veya birkaçının gözden kaçıp kaçırılmayacağına da bağlı. Ama bu iyi bir nokta. Teşekkürler :)
Pharaun

@blucz Çekirdek insanların bu durumları nasıl çözdüğünü kendime merak ediyordum. Bunu yaptıklarını bilmek güzel, tasarım ve uygulama konusunda kişiyi daha emin kılar.
n611x007


11

Microsoft'tan JNotify veya FileMon .


8
JNotify benim için mükemmeldi çünkü platformlar arası uyumluluğa ihtiyacım vardı. Sadece JAVA_HOME'un doğru ayarlandığını varsayarak cygwin, mac ve linux'ta çalışan tek bir bash betiği bile yazabildim. Bu, müşterinin makinelerinde "dosyamı sildi!" Dediklerinde sorunların giderilmesi için harika bir yardımcı olmuştur. Aslında günlüğe bakabilir ve bunun nasıl / ne zaman olduğunu anlamaya çalışabilirim.
cmyers

1
FileMon şimdi ProcessMonitor olan technet.microsoft.com/en-us/sysinternals/bb896645
MECU

10

Biraz geç ama ...

Windows, bir uygulama çalıştırmadan olayları izleyebileceğiniz OSX olaylarına benzer bir tesise sahiptir. Windows USN Journal, tüm dosya değişikliklerinin kaydını tutar. Jeffrey Richter (Advanced Windows yazarı) MSDN Journal için çalışma örnekleri içeren harika bir makale yazdı . Güncelleme : MSJ artık MS'te çevrimiçi olmadığı için archive.org'dan makale .

USN Değişiklik Günlükleri için MSDN belgeleri.

Yedekleme araçları veya tüm birimleri izlemesi gereken dizinler gibi uygulamalar oluşturuyorsanız, USN Change Journals muhtemelen daha iyidir.


USN Journal herhangi bir şekilde farklı mıdır, ona güvenerek FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes edildi bahsederken ?
n611x007

4
Bununla çalışmayalı epey oldu, ancak FileSystemWatcher veya FindFirstChangeNotification kullanmıyor. Go'da ağırlıklı olarak Jeffery Richter'in örneklerine dayalı bir Windows olay izleyicisi yazmaya başladım. Yaptığım testlere bakılırsa, son derece sağlam ve OS X'teki olaylar gibi hiçbir şeyi gözden kaçırmıyor. Esas burada: gist.github.com/pkrnjevic/7219861
Peter Krnjevic

@PeterKrnjevic Jeffrey Richter'deki makalenin bağlantısını güncelleyebilir misiniz?
SOUser

@SOUser, MS bitrot nedeniyle, makale artık archive.org'dan bağlanmıştır.
Peter Krnjevic

3

FileSystemWatcher (), temel olarak, izleyici arabelleği için hata işlemenin aşağı yukarı eksik olması nedeniyle güvenilmezdir. Yol eksikliği ve ayrıntılı hata işleme bilgileri nedeniyle, Microsoft size çalışma dizinini kurtarmanız veya el ile sorgulamanız için hiçbir yol sağlamaz.

Windows için JNotify da güvenilmez çünkü bu hata ^ win32'den kaynaklanıyor. JNotify, win32 kullanır. Yani, FileSystemWatcher () 'dan farklı değildir.


Bu 'hız' / 'yarış' / 'taşma' benzeri problemi çözmek için rolleri nasıl tasarlayacağımı düşünürken, çekirdeklerin bunu nasıl yaptığını kendime merak ettim. İlginç. Bu şey, ağ oluşturma ve günlük kaydı ile de gerçekleşir. Bu sorunun bir adı var mı?
n611x007

Evet, adı "böcek". Bugüne kadar Microsoft tarafından oluşturulan her işletim sisteminde hata (win32) bırakıldı. Bu, herhangi bir Microsoft işletim sistemini dosya izleme türü bir çözüm için uygun hale getirir. Bunu başarmak için * nix yapmalısınız. Bazen güvenlik nedenleriyle bu arabellek taşmasını kasıtlı olarak bıraktıklarını düşünüyorum.
Phillip Brandon Holmes

haha .. evet .. adı kasıtlı küme kludge, böylece microsoft'un dosya sistemi kasıtlı olarak izlenemez. Güvenlik endişeleri nedeniyle bıraktıkları bir hata.
Phillip Brandon Holmes

1

Biraz araştırma yaptım, Windows için benzer bir şey gördüğümü hatırlıyorum. .NET için FileSystemWatcher var . Esas olarak NT veya XP ve ileri için.


Daha genel olarak yalnızca NTFS Dosya Sistemlerinde bulunur, ancak FAT16, FAT32 ve hatta yeni exFAT'te yoktur.
Mastacheata

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.