Como ser notificado sobre alterações de arquivo/diretório em C/C++, de preferência usando POSIX

StackOverflow https://stackoverflow.com/questions/61253

  •  09-06-2019
  •  | 
  •  

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?)

Foi útil?

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.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top