Monitorando arquivos

Galera o negocio é o seguinte, preciso fazer uma aplicação java que fique escutando na maquina do cliente quando ele abre e fecha determinados arquivos em determinados diretorios, tem como monitorar isso com java, ou vou ter que descer o nivel e ir para C ou algo parecido?, colocar como serviço eu ja sei, minha duvida mesmo é como saber que um arquivo foi aberto e quando o mesmo foi fechado.

qualquer luz ta valendo…

grato pela ajuda

puts, tb quero saber.

Sei que se vc montar um esquema de observer/listenner vc consegue resolver isso mas vc vai ter que de tempos em tempos ficar pegando info das arquivos no so (desacobselhável, óbvio)

Eu posso fazer isso testanto os tamanhos do arquivo, se eles foram modificados, eu posso manter um arq xml que me diga qual era o tamanho

mais nao sei como fazer para saber se eles foram abertos e apenas para observação, se tivesse algu modo de saber se eles estão locados ou algo assim…

:roll:

o problema aí é que vc (java) vai ter que ficar, de tempos em tempos, pedindo pro so informações desses arquivos/pastas.

Imagina o seguinte:
Hoje vc diz quê de dez em 10 minutos basta pra sua “monitoração”, mas amanhão tu percebe que tem de ser de 1 em 1 minuto, e depois de 10 em 10 segundos (daí tu senta, chora e joga o código fora).

Não seria melhor vc fazer o so “notificar” qdo algo for alterado? Vc não vai precisar monitorar nada no java. Vai criar apenas um listenner (ouvinte) que será executado apenas qdo algum arquivo for modificado.

Agora vamos pro prático: vc pode escrever um serviço que se encarregue de monitorar essas pastas/arquivos (NT, C ou C++). Teria de ser um serviço pq assim vc teria como interceptar algum evento do so pra fazer essa brincadeira - qq outra forma, não tenho certeza, te forçará a escrever um loop e ficar perguntando quem foi alterado (e é isso que vc não quer certo?).

Acho que isso é complicado (não sei teu nível de java), mas caso vc tenha mais coragem do que vida social vamos tentar ver:

Dá uma olhado no sourceforge que deve ter os fontes de algum tipo de serviço semelhante lá (é a primeira parte, só te interessa o esquele do serviço).

Windows API vai ajudar tb.

Numa segunda parte vc poderia estudar JNI (Java Native Interface) pra saber como chamar c à partir do java e vice-versa.

Precisei de algo parecido em um projeto no qual trabalhei mas graças a deus o bichinho foi descontinuado (pro bem do resto da minha sanidade mental).

EDIT: vc pode optar por monitorar a pasta/arquivo (solução mais barata e rápida), mas fique ciente que se o número de pastas e arquivos forem muito grandes isso pode não funcionar com um bom tempo de resposta.

Já pensaram e sockets?! :wink:

Quando o usuário abrir o arquivo e fizer algo você envia um pacote…

Quanto ao listener deve ter algo no Windows API…

a) Se você tivesse feito o tal serviço em .NET você poderia usar System.IO.FileSystemWatcher. (Você não consegue saber se um arquivo foi fechado, apenas se ele foi criado, alterado, renomeado ou deletado).

b) O JBoss normalmente fica listando o diretório server/default/deploy para ver se há algo diferente que deva ser “deployed”. Ele normalmente só considera que um arquivo está completamente copiado quando ele mesmo consegue abri-lo. (Procure no fonte do JBoss como é que ele faz esse recurso de autodeploy)
É que enquanto um arquivo está sendo copiado, normalmente não é possível abrir o arquivo simultaneamente com o outro programa.

a questão de que foi modificado é simples…
eu queria mesmo saber como fazer para que o arquivo foi aberto e depois fechado sem ser modificado…
:wink:

Então, veja o fonte do JBoss. Deve ser uma classezinha boba no meio daqueles fontes todos.
O mais provável é que pegue a data de modificação do arquivo e fique monitorando isso.

lembrando que o tamanho do arquivo ser igual ou diferente, não quer dizer que ele foi alterado ou não, na pior das hipóteses, e pela lei de murphy tudo pode acontecer.
Interessante essa dúvida, se souber de algo posto aqui

O eclipse implementa monitoração de arquivos e diretórios. Você pode usar os fontes dele sem problema.

Só lembrando que a granularidade das datas de modificação no Windows dependem do filesystem.
Se não me engano, no NTFS é possível verificar a data de modificação com precisão de décimos de segundos.
No FAT, é coisa de 2 em 2 segundos. Mas isso precisa ser verificado (em algum lugar do MSDN deve estar escrito isso.)

uma vez fiz um sistema em python que lia os arquivos e gerava “hashes” com o md5 para saber se foram alterados… implementar uma versao em JAVA para tal deve ser facil…
mas para arquivos muito grandes (ou para diretorios com muitos arquivos) era um tanto demorado…

Neste topico voces falam que eh facil monitorar uma pasta ou arquivo. E isso é justamente o que estou precisando.

Ou seja: preciso monitorar uma pasta de modo que um evento seja disparado quando algum arquivo for colocado nela.

Poderiam me fornecer algum exemplo?

Sei que faz tempo o primeiro post … mas “trombei” com estes arquivos no Google e resolvi compartilhar …

Pagina inicio:
http://www2.hawaii.edu/~qzhang/FileSystemWatcher.html

Fontes:
http://www2.hawaii.edu/~qzhang/FileSystemWatcher/index.html

Espero que ajudem.

PS: Não testei nada … mas acredito que já seja uma luz

[]s
Roger Leite