Continuando com nosso artigo. Abra o Visual Studio, crie uma nova aplicação Windows Form e dê o nome de ExemploFileSystemWatcher.
No form que é criado, arraste os controles e adicione o componente FileSystemWatcher para que seu form fique da seguinte forma:
Os ID’s dos controles, na ordem que está no form, são esses: lblPasta, txtPasta, lblFiltro, txtFiltro, lblNotificacoes, txtNotificacoes, cboHabilitaEventos e cboIncluirSubDiretorios (CheckBoxes), gboFSW (GroupBox), lblArquivoDiretorio, txtArquivoDiretorio, btnCriaArquivo, btnCriaDiretorio e btnDeletaArquivo.
Lembrando que esses são os ID’s que eu usei, nada os impede de usar a nomenclatura que mais for favorável e intuitivo a vocês.
Como vocês podem ver na imagem acima, no txtPasta deixei um caminho padrão para usarmos neste exemplo e no txtFiltro, deixei como padrão o *.*, que como já dito anteriormente, indica que todos os tipos de arquivos serão monitorados.
Agora vamos ao Page_Load da página para fazer com que tudo isto funcione. Para isso, dê dois cliques em cima do form e insira o seguinte código (está comentado para melhor entendimento):
Antes, não se esqueça do using:
using System.IO;
Agora sim:
private void Form1_Load(object sender, EventArgs e)
{
try
{
//caminho da pasta que o FileSystemWatcher irá monitorar (atribuo o valor do TextBox)
fsw.Path = txtPasta.Text;
//tipos de filtro que o FileSystemWatcher irá considerar
fsw.Filter = txtFiltro.Text;
//lista de atributos que irão disparar eventos
fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.CreationTime;
//permitir a monitoração (sem o valor estar como true, é impossível do FSW monitorar os arquivos)
fsw.EnableRaisingEvents = cboHabilitaEventos.Checked;
//monitorar subdiretórios (atribuo o valor do checkbox. Como está checado, assume o valor true)
fsw.IncludeSubdirectories = cboIncluirSubDiretorios.Checked;
//uso a propriedade abaixo como false para evitar o erro de chamada ilegal de thread, que pode
//acessar um controle em outra thread aconteça. Se isso acontecer, será disparado uma exceção.
CheckForIllegalCrossThreadCalls = false;
//uso do WaitForChangedResults (mostrado no artigo) para Windows Services e Console Application's
//instancio a classe WaitForChangedResults, passando o FSW com o método WaitForChanged e dois
//parâmetros: o tipo de modificações que ele irá aguardar, que no caso são todas, e o tempo de
//espera para que sejam disparados estes eventos, que será de 10 segundos.
WaitForChangedResult wcr = fsw.WaitForChanged(WatcherChangeTypes.All, 10000);
//faço uma verificação, se der Timeout (passar o tempo esperado de 10 segundos),
//disparo um aviso. Se não der Timeout, exibo o Nome do Evento e o Tipo dele.
if (wcr.TimedOut)
{
Console.WriteLine("Já se passaram 10 minutos do evento");
}
else
{
Console.WriteLine("Evento: " + wcr.Name, wcr.ChangeType.ToString());
}
}
catch (Exception)
{
throw;
}
}
PS: Não se esqueça de sempre usar Try/Catch em seu código.
Agora voltemos ao form. Abra a ToolBox (CTRL + W + X), arraste o componente FileSystemWatcher para seu form e deixe o nome padrão dele, fileSystemWatcher1. Ainda nas Propriedades, vá aos eventos do FSW e dê dois cliques em cima de cada evento para chamar o respectivo método:
Na próxima parte de nosso artigo vamos codificar os eventos e os 4 métodos, referentes à estes eventos para, assim, terminarmos nosso projeto.
Assim finalizo o artigo. Muito obrigado a todos!
Um abraço, e até o próximo artigo
Wellington Balbo de Camargo
wellingtonbalbo@gmail.com