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.

Foi útil?

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

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