Artigo Clube Delphi Edição 31 - Diretórios monitorados

Artigo da Revista Clube Delphi Edição 31.

Esse artigo faz parte da revista Clube Delphi edição 31. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.
 

Diretórios monitorados

Detectando alterações em arquivos no disco

Existem certas ocasiões onde você necessita saber quando ocorrem mudanças em um determinado diretório, para poder apresentá-las ao usuário, ou mesmo para poder executar alguma ação. Um exemplo disso poderia ser um sistema centralizado de envio de mensagens – todos os usuários da rede criam suas mensagens em um programa padrão, que gera um arquivo num diretório centralizado. Uma outra aplicação monitora este diretório e, quando um novo arquivo é gravado ali, ele despacha a mensagem.

Outro tipo de aplicação que pode fazer uso deste recurso é uma lista que mostra o conteúdo de uma pasta. Digamos que você deseja que esta lista seja atualizada automaticamente quando ocorrem mudanças. Uma maneira de fazer isso seria criar uma thread secundária e ficar monitorando continuamente a pasta, para ver se algo ocorre. A thread teria um código semelhante a:

 

while not Terminated do

  MonitoraDiretorio;

  Application.ProcessMessages;

end;

 

Isto, além de ineficiente, consome muitos recursos da CPU. Seria interessante encontrar outra maneira de fazer isso. O Windows tem as funções FindFirstChangeNotification e FindNextChangeNotification, que monitoram, de forma eficiente, um determinado diretório. Neste artigo, veremos como usar estas funções e criaremos um componente que, quando colocado num formulário, possibilitará a monitoração de qualquer diretório, ativando eventos quando este sofrer alterações.

Funções de notificação

Se você olhar no arquivo de ajuda da API do Windows sobre FindFirstChangeNotification, verá algo como:

 

{ A função FindFirstChangeNotification cria um manipulador

 de notificação de mudança e configura as condições de

 filtro de notificação iniciais. Uma espera sobre o

 manipulador de notificação tem sucesso quando uma mudança

 correspondente às condições de filtro ocorrem no diretório

 ou em subdiretórios.

}
HANDLE FindFirstChangeNotification(
  // ponteiro para no nome do diretório a ser observado

  LPCTSTR lpPathName,
  // monitoração do diretório ou árvore de diretórios

  BOOL bWatchSubtree,
  // condições de filtro a serem observadas

  DWORD dwNotifyFilter
);

 

Isto não parece muito amigável, a coisa não parece ser tão simples assim. Vamos ver inicialmente os parâmetros de FindFirstChangeNotification. O primeiro parâmetro é um PChar contendo o nome do diretório a ser monitorado. O segundo parâmetro é um valor lógico indicando se a monitoração será feita apenas no diretório solicitado ou em todos os subdiretórios deste diretório. O último parâmetro indica a condição de filtro de monitoração. Esta condição é uma combinação or de uma ou mais das seguintes constantes:

FILE_NOTIFY_CHANGE_FILE_NAME – ativa a notificação quando há uma mudança no nome de algum arquivo no diretório, incluindo a criação, exclusão ou mudança de nome de arquivos." [...] continue lendo...

Artigos relacionados