Monitoramento diretório Modificação
-
02-07-2019 - |
Pergunta
Estou construindo uma aplicação C # que irá monitorar um diretório especificado para alterações e adições e armazenar as informações em um banco de dados.
Eu gostaria de evitar a verificação de cada arquivo individual para as modificações, mas não tenho certeza se posso confiar completamente o tempo de acesso de arquivo.
Qual seria o melhor método a utilizar para obter os arquivos modificados recentemente em um diretório?
Seria verificar se há modificações somente quando o usuário solicita-lhe que, não vai ser um serviço constantemente em execução.
Solução
Hmm ... pergunta interessante. Inicialmente eu apontá-lo no FileSystemWatcher classe . Se você estiver indo para tê-lo funcionar, no entanto, a pedido do utilizador, então parece que você pode precisar armazenar fora a informação diretório inicialmente e depois comparar cada vez que as solicitações do usuário. Eu provavelmente ir com um FileSystemWatcher e apenas armazenar fora de seus resultados de qualquer maneira.
Outras dicas
Use o objeto FileSystemWatcher. Aqui está um código para fazer o que você está procurando.
// Declares the FileSystemWatcher object FileSystemWatcher watcher = new FileSystemWatcher(); // We have to specify the path which has to monitor watcher.Path = @"\\somefilepath"; // This property specifies which are the events to be monitored watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | notifyFilters.DirectoryName; watcher.Filter = "*.*"; // Only watch text files. // Add event handlers for specific change events... watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // Begin watching. watcher.EnableRaisingEvents = true; // Define the event handlers. private static void OnChanged(object source, FileSystemEventArgs e) { // Specify what is done when a file is changed, created, or deleted. } private static void OnRenamed(object source, RenamedEventArgs e) { // Specify what is done when a file is renamed. }
Eu acho que o que você quer é fornecido pelo FileSystemWatcher classe.
Este tutorial descreve como usá-lo para monitorar um diretório para mudanças em um serviço do Windows simples; Como implementar um simples Filewatcher serviço do Windows em C #
Se você só precisa dele para verificar quando o usuário pede um pouco então o tempo todo, não use o FileSystemWatcher. Especialmente se for um recurso compartilhado - a última coisa que você quer é 50 máquinas cliente assistindo ao mesmo diretório compartilhado.
É provavelmente apenas um erro, mas você não deve estar a olhar para o tempo de acesso de arquivo, você quer olhar para o tempo de modificação do arquivo para pegar mudanças. Mesmo isso não é confiável.
O que eu gostaria de fazer é implementar algum tipo de função de soma de verificação na data de arquivo e tamanho byte, ou outras propriedades do sistema de arquivos. Dessa forma, eu não estaria à procura de mudanças no arquivo completo -. Apenas as propriedades dele e eu posso fazê-lo, a pedido, ao invés de tentar realizar uma ligação a um recurso remoto para monitorá-lo
Uma solução mais pesado seria a fazê-lo o contrário, e instalar um serviço na máquina que hospeda a unidade compartilhada que poderia monitorar os arquivos e anote as alterações. Então você pode consultar o serviço ao invés de tocar os arquivos em tudo -. Mas é provavelmente um exagero