Existe algo como o inotify no Windows?

103

Com o sistema operacional Linux, existe o subsistema ionotify que notifica um aplicativo sobre alterações no sistema de arquivos.

No entanto, sou principalmente um usuário do Windows, então queria saber se existe uma maneira semelhante de monitorar as alterações do sistema de arquivos.

johansson
fonte
9
Não acho que essas questões estejam fora do assunto. A questão pede uma API do sistema operacional que é muito diferente de qualquer ferramenta / biblioteca de software. Pode ser que possa ser formulado de forma diferente, como a forma de ser notificado em um aplicativo do Windows quando um determinado arquivo / arquivos são modificados.
balki
1
Votado para reabrir: A questão está pedindo uma alternativa comparável a uma API de sistema operacional específica e, em termos figurativos, parece "Eu sou da Inglaterra, onde uso um garfo para comer, no Japão, qual utensílio devo usar de maneira semelhante? " A resposta aceita usando essa analogia é "use os pauzinhos".
David

Respostas:

42

Se você estiver usando .net , use FileSystemWatcher. Mais informações aqui: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Se você estiver usando C , utilização FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Mais informações aqui: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

No OSX , a api relevante é a fseventsapi.

Eles são todos sutilmente diferentes uns dos outros e todos têm confiabilidade questionável em casos extremos. Em geral, você não pode depender dessas apis para uma visão completa de todas as alterações 100% do tempo. A maioria das pessoas que usa o monitoramento do sistema de arquivos o combina com varreduras periódicas para compensar as informações perdidas ou incompletas da API push.

blucz
fonte
6
Você pode dar alguma citação sobre a "confiabilidade questionável no caso de borda para inotify?
Pharaun
18
Se um consumidor de uma API do observador fs for mais lento na leitura de eventos do que algum outro processo em gerá-los, o kernel precisa conter modificações no sistema de arquivos no outro processo (possivelmente de maior prioridade) ou permitir o crescimento ilimitado do buffer. A profundidade do buffer do inotify (conforme documentado na página de manual) é controlada por / proc / sys / fs / inotify / max_queued_events. Além disso, você recebe uma notificação IN_Q_OVERFLOW - isso é bom, mas você ainda está em uma situação em que pode precisar verificar novamente de vez em quando.
blucz de
Aha certo, recentemente eu estava lendo na fila. Eu acho que este caso extremo dependeria de quantos arquivos você está monitorando e também depende se é crítico monitorar todas as alterações ou se algumas podem ser perdidas. Mas esse é um bom ponto. Obrigado :)
Pharaun
@blucz Eu estava me perguntando como as pessoas do kernel resolvem essas situações. É bom saber que eles fazem isso, deixa a pessoa mais confiante no design e na implementação.
n611x007
11

JNotify ou FileMon da Microsoft.

Eugene
fonte
8
JNotify era perfeito para mim porque eu precisava de compatibilidade entre plataformas. Consegui até escrever um único script bash que funcionava em cygwin, mac e linux, presumindo apenas que JAVA_HOME estava configurado corretamente. Isso tem sido uma grande ajuda para depurar problemas nas máquinas dos clientes, quando eles dizem "excluiu meu arquivo!" Posso realmente olhar o log e tentar descobrir como / quando isso aconteceu.
cmyers
1
FileMon agora é ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU de
10

Um pouco tarde mas ...

O Windows possui um recurso semelhante aos eventos OSX, por meio do qual você pode monitorar eventos sem executar um aplicativo. O Windows USN Journal mantém registro de todas as alterações de arquivo. Jeffrey Richter (autor de Advanced Windows) escreveu um excelente artigo com exemplos de trabalho para o MSDN Journal. Atualização : artigo agora de archive.org desde que MSJ não está mais online em MS.

Documentação do MSDN para USN Change Journals.

Os diários de mudança da USN são provavelmente melhores se você estiver criando aplicativos como ferramentas de backup ou índices que precisam monitorar volumes inteiros.

Peter Krnjevic
fonte
O USN Journal é diferente, confiar nele evita o comportamento bugado de FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes estava falando ?
n611x007
4
Já faz um tempo que trabalho com isso, mas não usa FileSystemWatcher ou FindFirstChangeNotification. Comecei a escrever um observador de eventos do Windows em Go, baseado fortemente nos exemplos de Jeffery Richter. Pelo pouco de teste que fiz, é sólido como uma rocha e não perde nada, semelhante a fsevents no OS X. A essência
Peter Krnjevic
@PeterKrnjevic Você pode atualizar o link do artigo de Jeffrey Richter?
SOUser de
@SOUser, devido ao MS bitrot, o artigo agora está vinculado a archive.org.
Peter Krnjevic
3

FileSystemWatcher () não é confiável principalmente devido ao fato de que o tratamento de erros para o buffer do observador é mais ou menos incompleto. Devido à falta de caminho e informações detalhadas de tratamento de erros, a Microsoft não oferece nenhuma maneira de recuperar ou pesquisar manualmente o diretório de trabalho.

O JNotify para Windows também não é confiável porque esse bug ^ deriva do win32. JNotify usa win32. Portanto, não é diferente de FileSystemWatcher ().

Phillip Brandon Holmes
fonte
pensando em como projetar papéis para resolver esse problema tipo 'velocidade' / 'corrida' / 'estouro', eu me perguntei como os kernels faziam isso. Interessante. Isso também ocorre com a rede e o registro. Este problema tem nome?
n611x007
Sim, seu nome é "bug". O bug (win32) foi deixado em todos os sistemas operacionais criados pela Microsoft até o momento. Isso torna qualquer sistema operacional Microsoft impróprio para uma solução do tipo de observação de arquivos. Você tem que ir * nix para realizá-lo. Às vezes, acho que eles deixaram intencionalmente esse estouro de buffer por motivos de segurança.
Phillip Brandon Holmes
haha .. sim .. seu nome é cluster kludge intencional para que o sistema de arquivos da Microsoft não possa ser observado intencionalmente. É um bug que eles deixaram devido a questões de segurança.
Phillip Brandon Holmes
1

Fiz uma pequena pesquisa, parece que me lembro de ter visto algo semelhante para o Windows. Existe o FileSystemWatcher para .NET. É principalmente para NT ou XP e para a frente.

Pharaun
fonte
Geralmente, está disponível apenas em sistemas de arquivos NTFS, mas não em FAT16, FAT32 ou mesmo no novo exFAT.
Mastacheata 01 de