quinta-feira, 21 de abril de 2011

Monitorando pastas com C# .Net

Uma classe pouco conhecida, mas para quem deseja monitorar pastas e arquivos é de fundamental importância, é a FileSystemWatcher.

Normalmente quando vamos monitorar uma pasta, abrimos um while infinito e ficamos aguardando algum arquivo ser gravado/alterado ou pastas serem criadas/alteradas, porem isso costuma consumir muito recuso do equipamento, principalmente rede se a pasta monitorada for em outro equipamento. Para resolver isso seria interessante criarmos um aplicativo que fique dormindo, sem nenuma ação, até que algum arquivo fosse gravado/alterado na pasta e o aplicativo recebesse um sinal, daí sim o aplicativo poderia entrar em ação. Esta é a função da FileSystemWatcher, sempre que uma ação ocorre na pasta ou pastas monitoradas ela dispara eventos e nós podemos tratar da forma que desejarmos. Veja um exemplo de como utilizar:

  1: using System.IO;
  2: 
  3: ...
  4: 
  5: //Criamos o objeto dizendo qual pasta deve ser monitorada
  6: System.IO.FileSystemWatcher fsw = new FileSystemWatcher("c:\teste");
  7: 
  8: //Dizemos agora se é para monitorar os subdiretórios ou não
  9: fsw.IncludeSubdirectories = false;
 10: 
 11: //Através de um Enum dizemos quais eventos devem ser monitorados, modificação da data do arquivo, tamanho, etc...
 12: fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
 13: 
 14: //Dizemos quais tipos de arquivos devem ser monitorados, *.*, *.xml, *.txt, etc...
 15: fsw.Filter = "*.xml";
 16: 
 17: //Definimos agora os eventos a serem gerados
 18: fsw.Changed += new FileSystemEventHandler(fsw_Changed);
 19: fsw.Created += new FileSystemEventHandler(fsw_Created);
 20: fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
 21: fsw.Deleted += new RenamedEventHandler(fsw_Deleted);
 22: fsw.Error += new ErrorEventHandler(fsw_Error);
 23: 
 24: //A propriedade abaixo define que a monitoração deve iniciar, se false, a pasta não será monitorada
 25: fsw.EnableRaisingEvents = true;
 26: 
 27: ...
 28: 
 29: // Abaixo os métodos para tratar os eventos gerados pela FileSystemWatcher
 30: 
 31: //Quando o arquivo ou pasta for alterado
 32: private void fsw_Changed(object sender, FileSystemEventArgs e)
 33: {
 34:     //Vamos demonstar o nome do arquivo ou pasta alterada
 35:     Console.WriteLine(e.FullPath);
 36: }
 37: 
 38: //Quando um arquivo ou pasta for criada
 39: private void fsw_Created(object sender, FileSystemEventArgs e)
 40: {
 41:     //Vamos demonstar o nome do arquivo ou pasta criada
 42:     Console.WriteLine(e.FullPath);
 43: }
 44: 
 45: //Quando um arquivo ou pasta for renomeada
 46: private void fsw_Renamed(object sender, FileSystemEventArgs e)
 47: {
 48:     //Vamos demonstar o nome do arquivo ou pasta renomeada
 49:     Console.WriteLine(e.FullPath);
 50: }
 51: 
 52: //Quando um arquivo ou pasta for deletada
 53: private void fsw_Renamed(object sender, FileSystemEventArgs e)
 54: {
 55:     //Vamos demonstar o nome do arquivo ou pasta deletada
 56:     Console.WriteLine(e.FullPath);
 57: }
 58: 
 59: //Quando ocorrer algum erro o evento abaixo será gerado
 60: private void fsw_Error(object sender, ErrorEventArgs e)
 61: {
 62:     //Através deste evento podemos monitorar e tratar os erros
 63: }


Dica:



Um erro que pode ocorrer é o de estouro de buffer. A FileSystemWatcher tem um buffer para os eventos, e se uma quantidade de eventos gerada simultaneamente for muito grande, o buffer pode estourar. Podemos aumentar o tamanho do buffer, porem isso pode consumir recursos desnecessários. Aconselhamos trabalhar com as propriedades Filter, NotifyFilter e IncludeSubdirectories, afim de monitorar somente o necessário, evitando assim o exceço de eventos simultâneos e naturalmente o estouro do buffer.



. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .



Unidanfe - Impressão de DANFE e envio de XML para destinatários de NF-e

www.unidanfe.com.br