C'è qualcosa come inotify su Windows?


103

Con il sistema operativo Linux, c'è il sottosistema ionotify che notifica a un'applicazione le modifiche al filesystem.

Tuttavia, sono principalmente un utente Windows, quindi mi chiedevo se esiste un modo simile per monitorare le modifiche al filesystem?


9
Non credo che queste domande siano fuori tema. La domanda richiede un'API del sistema operativo che è molto diversa da qualsiasi strumento / libreria software. Può essere formulato in modo diverso come come ricevere una notifica in un'applicazione Windows quando vengono modificati determinati file / file.
balki

1
Votato per riaprire: la domanda chiede un'alternativa paragonabile a una specifica API del sistema operativo e in modo figurato mi si legge come "Vengo dall'Inghilterra, dove uso una forchetta per mangiare cibo, in Giappone quale utensile uso in modo simile? " La risposta accettata usando questa analogia è "usa le bacchette".
David

Risposte:



42

Se stai usando .net , usa FileSystemWatcher. Maggiori informazioni qui: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Se stai usando C , l'uso FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Maggiori informazioni qui: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

Su OSX , l'API rilevante è l' fseventsAPI.

Sono tutti sottilmente diversi l'uno dall'altro e hanno tutti un'affidabilità discutibile nei casi limite. In generale, non puoi fare affidamento su queste API per una visione completa di tutte le modifiche il 100% delle volte. La maggior parte delle persone che utilizzano il monitoraggio del file system lo combinano con scansioni periodiche per compensare le informazioni perse o incomplete dall'API push.


6
Puoi per favore fare qualche citazione sulla "discutibile affidabilità in caso limite per inotify?
Pharaun

18
Se un utente di un'API fs watcher è più lento nella lettura degli eventi rispetto a qualche altro processo nel generarli, il kernel deve o contenere le modifiche del filesystem nell'altro processo (possibilmente con priorità più alta), o consentire una crescita illimitata del buffer. La profondità del buffer di inotify (come documentato nella pagina man) è controllata da / proc / sys / fs / inotify / max_queued_events. Oltre a questo, ricevi una notifica IN_Q_OVERFLOW: va bene, ma ti trovi ancora in una situazione in cui potresti dover ripetere la scansione di tanto in tanto.
blucz

Ah giusto, di recente stavo leggendo in coda. Penso che questo caso limite dipenda dal numero di file che stai monitorando e dipende anche se è fondamentale tenere traccia di tutte le modifiche o se alcuni possono essere persi. Ma questo è un buon punto. Grazie :)
Pharaun

@blucz Mi stavo chiedendo come le persone del kernel risolvano queste situazioni. Buono a sapersi che lo fanno, rende più sicuri nella progettazione e nell'implementazione.
n611x007


11

JNotify o FileMon di Microsoft.


8
JNotify era perfetto per me perché avevo bisogno di compatibilità multipiattaforma. Sono stato persino in grado di scrivere un singolo script bash che funzionasse in cygwin, mac e linux presumendo solo che JAVA_HOME fosse impostato correttamente. Questo è stato di grande aiuto per il debug dei problemi sulle macchine dei clienti, quando dicono "ha cancellato il mio file!" Posso effettivamente guardare il registro e cercare di capire come / quando è successo.
cmyers

1
MECU

10

Un po 'tardi ma ...

Windows ha una funzionalità simile agli eventi OSX in cui è possibile monitorare gli eventi senza eseguire un'app. Il Windows USN Journal tiene traccia di tutte le modifiche ai file. Jeffrey Richter (autore di Advanced Windows) ha scritto un fantastico articolo con esempi funzionanti per MSDN Journal. Aggiornamento : articolo ora da archive.org poiché MSJ non è più online su MS.

Documentazione MSDN per i giornali di modifica USN.

I giornali di modifica USN sono probabilmente migliori se stai creando applicazioni come strumenti di backup o indici che devono monitorare interi volumi.


L'USN Journal è diverso? Fare affidamento su di esso evita il comportamento errato di FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes stava parlando ?
n611x007

4
È passato un po 'di tempo da quando ho lavorato con questo, ma non utilizza FileSystemWatcher o FindFirstChangeNotification. Ho iniziato a scrivere un osservatore di eventi di Windows in Go, basato ampiamente sugli esempi di Jeffery Richter. Dal test che ho fatto, è solido come una roccia e non perde nulla, simile a fsevents in OS X. Gist è qui: gist.github.com/pkrnjevic/7219861
Peter Krnjevic

@PeterKrnjevic Puoi aggiornare il link per l'articolo di Jeffrey Richter?
SOUser

@SOUser, a causa del bitrot di MS, l'articolo è ora collegato da archive.org.
Peter Krnjevic

3

FileSystemWatcher () è inaffidabile principalmente perché la sua gestione degli errori per il buffer watcher è più o meno incompleta. A causa della mancanza di percorso e di informazioni dettagliate sulla gestione degli errori, Microsoft non offre alcun modo per ripristinare o eseguire il polling manuale della directory di lavoro.

Anche JNotify per Windows è inaffidabile perché questo bug ^ deriva da win32. JNotify utilizza win32. Quindi, non è diverso da FileSystemWatcher ().


pensando a come progettare ruoli per risolvere questo problema simile a "velocità" / "corsa" / "overflow", mi sono chiesto come facessero i kernel. Interessante. Questa cosa si verifica anche con la rete e la registrazione. Questo problema ha un nome?
n611x007

Sì, il suo nome è "bug". Il bug (win32) è stato lasciato in ogni sistema operativo creato da Microsoft fino ad oggi. Ciò rende qualsiasi sistema operativo Microsoft inadatto per una soluzione di tipo di visualizzazione di file. Devi andare * nix per realizzarlo. A volte penso che abbiano intenzionalmente lasciato questo overflow del buffer per motivi di sicurezza.
Phillip Brandon Holmes

haha .. sì .. il suo nome è intenzionale cludge del cluster in modo che il file system di Microsoft non possa essere guardato intenzionalmente. È un bug che hanno lasciato a causa di problemi di sicurezza.
Phillip Brandon Holmes

1

Ho fatto un po 'di ricerca, mi sembra di ricordare di aver visto qualcosa di simile per Windows. C'è FileSystemWatcher per .NET. È principalmente per NT o XP e avanti.


È più generalmente disponibile solo su file system NTFS, ma non su FAT16, FAT32 o anche sul nuovo exFAT.
Mastacheata

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.