Como ser notificado sobre alterações de arquivo/diretório em C/C++, de preferência usando POSIX
Pergunta
O assunto diz tudo - normalmente a maneira fácil e multiplataforma é fazer pesquisas de forma inteligente.Mas todo sistema operacional possui alguns meios de notificar sem pesquisar.É possível de uma forma razoavelmente multiplataforma?(Eu realmente só me importo com Windows e Linux, mas uso mac, então pensei que o posix poderia ajudar?)
Solução
Usuários Linux podem usar notificar
O Inotify é um subsistema do kernel Linux que fornece notificação de eventos do sistema de arquivos.
Algumas vantagens para os colegas do Windows:
Outras dicas
A biblioteca Qt possui um QFileSystemWatcher classe que fornece notificações entre plataformas quando um arquivo é alterado.Mesmo se você não estiver usando Qt, como o código-fonte está disponível, você pode dar uma olhada nele como um exemplo para sua própria implementação.Qt possui implementações separadas para Windows, Linux e Mac.
Há API de eventos do sistema de arquivos como do Leopardo.
Não creio que o próprio POSIX tenha facilidades para isso.O mais próximo da plataforma cruzada que já vi é FAM, que parece funcionar para Linux, BSD e Irix, mas não sei como seria fácil portá-lo para Windows e MacOS.
Na verdade, eu construí esse sistema antes para uso em uma base de código C++ comercial - contanto que você não precise de todas as coisas estranhas existentes, os sistemas Windows e POSIX têm muitas sobreposições que você pode abstrair.
POSIX:Use inotify - é um sistema completo construído literalmente para este trabalho
Janelas:Use "alterar eventos".Você mesmo precisa criar mais cola e relatórios (todas as APIs necessárias estão disponíveis, mas não há o que o inotify oferece para compras em um único lugar).
As coisas comuns que você pode detectar em seu "tópico de notificação" para encaminhamento de eventos são:
1) Basicamente, qualquer operação invasiva boost::filesystem suporta, com a (possível) exceção de modificação de permissões.São coisas como mover, criar, excluir, copiar pastas e arquivos.
2) Lê e grava em arquivos (especialmenteescreve).Esteja ciente de que se você estiver usando E/S assíncrona, as notificações poderão aparecer fora de ordem.
3) Quando chega um novo volume, como alguém conectando um pen drive.
O inotify oferece especialmente um nível insano de controle refinado, o Windows nem tanto.Com o inotify você pode literalmente monitorar tudo o que o sistema de arquivos está fazendo quase em tempo real, se você realmente quiser.Eu sei que o número 3 é possível com ambos sem votação, mas esteja ciente de que pode ser muito complicado fazê-lo funcionar corretamente em qualquer sistema.
Acredito que o OS X agora possui ganchos/retornos de chamada apropriados porque eles eram necessários para a indexação do Spotlight.
No Linux, você terá o problema adicional de haver vários sistemas de arquivos comumente usados.Se você precisar da funcionalidade apenas para uma quantidade limitada de arquivos/diretórios, tentarei procurar ativamente por modificações em intervalos regulares.
evento libe ou libev parecem ser o que você deseja, embora eu não os tenha usado.