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 monitorada6: System.IO.FileSystemWatcher fsw = new FileSystemWatcher("c:\teste");7:8: //Dizemos agora se é para monitorar os subdiretórios ou não9: 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 gerados18: 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á monitorada25: fsw.EnableRaisingEvents = true;26:27: ...28:29: // Abaixo os métodos para tratar os eventos gerados pela FileSystemWatcher30:31: //Quando o arquivo ou pasta for alterado32: private void fsw_Changed(object sender, FileSystemEventArgs e)33: {34: //Vamos demonstar o nome do arquivo ou pasta alterada35: Console.WriteLine(e.FullPath);36: }37:38: //Quando um arquivo ou pasta for criada39: private void fsw_Created(object sender, FileSystemEventArgs e)40: {41: //Vamos demonstar o nome do arquivo ou pasta criada42: Console.WriteLine(e.FullPath);43: }44:45: //Quando um arquivo ou pasta for renomeada46: private void fsw_Renamed(object sender, FileSystemEventArgs e)47: {48: //Vamos demonstar o nome do arquivo ou pasta renomeada49: Console.WriteLine(e.FullPath);50: }51:52: //Quando um arquivo ou pasta for deletada53: private void fsw_Renamed(object sender, FileSystemEventArgs e)54: {55: //Vamos demonstar o nome do arquivo ou pasta deletada56: Console.WriteLine(e.FullPath);57: }58:59: //Quando ocorrer algum erro o evento abaixo será gerado60: private void fsw_Error(object sender, ErrorEventArgs e)61: {62: //Através deste evento podemos monitorar e tratar os erros63: }
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
Nenhum comentário:
Postar um comentário