Artigo Clube Delphi Edição 31 - Diretórios monitorados
Artigo da Revista Clube Delphi Edição 31.
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
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo