terça-feira, 11 de janeiro de 2011

Monitorando Arquivos com C#

Para você que deseja monitorar alterações em arquivos ou pastas em seu computador, o .NET FrameWork possui a classe FileSystemWatcher no namespace System.IO.
A implementação é simples e possui inúmeras propriedades, então mão na massa.

Crie um projeto Console e Adicione o Namespace System.IO.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FileSystemWatcherChp2
{
    class Program
    {
        static void Main(string[] args)
        {
 }
    }
}



Feito isso vamos instanciar a classe FileSystemWatcher, seu construtor possui 3 overloads, neste passaremos o caminho a ser monitorado, neste exemplo iremos utilizar a variavel de ambiente para resgatar os diretórios da "USERPROFILE".

static void Main(string[] args)
  {
    FileSystemWatcher fsw = 
                     new FileSystemWatcher(Environment.GetEnvironmentVariable("USERPROFILE"));     
  }


Agora vamos setar algumas propriedades importantes para nosso programa, por exemplo o tipo de alteração no arquivo, para maior referência das propriedades acesse http://bit.ly/bNVlCi.

static void Main(string[] args)
  {
    FileSystemWatcher fsw = 
                     new FileSystemWatcher(Environment.GetEnvironmentVariable("USERPROFILE"));     

     //Propriedade para informar se deve monitorar subdiretorios ou somente o principal
     fsw.IncludeSubdirectories = true;
     //Tipo de Notificação
     //(FileName,LastWrite,DirectoryName,Attributes,Size,LastAccess,CreationTime,Security)
     fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
  }


Um filtro interessante é a propriedade Filter, que lhe possibilita monitorar inclusive um arquivo em especifico. 
Para monitorar as alterações precisamos de eventos, para indicar quando algo acontece, dos eventos implementados para esta classe cabe destaque para 4:
Em nosso exemplo utilizaremos somente o changed e o Renamed.

static void Main(string[] args)
  {
    FileSystemWatcher fsw = 
                     new FileSystemWatcher(Environment.GetEnvironmentVariable("USERPROFILE"));     

     //Propriedade para informar se deve monitorar subdiretorios ou somente o principal
     fsw.IncludeSubdirectories = true;
     //Tipo de Notificação
     //(FileName,LastWrite,DirectoryName,Attributes,Size,LastAccess,CreationTime,Security)
     fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
     //Evento changed, para alterações gerais no arquivo ou pasta
     fsw.Changed += new FileSystemEventHandler(fsw_Changed);
     //Evento Renamed, específico para alteração do nome do arquivo ou pasta
     fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
     //Inicia o Monitoramento
     fsw.EnableRaisingEvents = true;

     //console.read para impedir que a aplicação finalize sua execução
     Console.Read();
  }

E por fim, os métodos que recebem as chamadas dos eventos.

//Evento Changed
   static void fsw_Changed(object sender, FileSystemEventArgs e)
   {
       //Escreve o tipo de alteração e o endereço do arquivo ou pasta alterado
        Console.WriteLine(e.ChangeType + ": " + e.FullPath);
   }
    //Evento Renamed
    static void fsw_Renamed(object sender, RenamedEventArgs e)
    {
       //Escreve na tela o nome de origem e seu novo nome
       Console.WriteLine("from: " + e.OldFullPath + " to: " + e.FullPath);
    }


Veja o resultado: