| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/07/2009 08:08:59
|
Sabatt
HelloWorld
Membro desde: 26/07/2009 08:03:02
Mensagens: 11
Offline
|
Olá, eu preciso criar um programa java que monitore uma pasta à minha escolha, e perceba quando eu crio ou altero um arquivo dentro dela. Eu achei pela net que existe uma classe FileSystemWatcher que faz isso, mas só funciona em Windows mas eu precisava que funcionasse em todos os SO.
Alguem sabe como eu posso fazer isso?
Obrigado desde já.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/07/2009 11:19:41
|
alevi
JavaChild
![[Avatar]](/images/avatar/77d13a096e771552d84d4af5f8ba7980.jpg)
Membro desde: 27/01/2007 13:58:04
Mensagens: 145
Offline
|
Olá!
Seu problema é dependente do OS - neste caso, vai ter que implementar uma solução para cada OS que for utilizar (a não ser que você consiga monitorar pela data etc).
Talvez seja necessário utilizar libraries nativas de cada plataforma (dll, so) e capturar o evento da pasta...
This message was edited 1 time. Last update was at 27/07/2009 11:20:21
|
http://www.walkersystems.com.br
SCJP |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/07/2009 11:40:15
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Sabatt wrote:mas eu precisava que funcionasse em todos os SO.
"Funcione em todos os SOs"? Isso não existe em Java, mesmo usando apenas métodos dos pacotes java.* (nem os pacotes javax.* têm garantias de funcionarem em todos os SOs".
Reduza um pouco seu escopo (por exemplo, "quero que funcione em Windows, Linux c/ kernel 2.6 e Solaris 10") e veja o que é possível fazer em cada um.
(Por exemplo, em Windows você pode usar uma biblioteca nativa, como é o caso do tal FileSystemWatcher que você encontra na Internet, e em Linux talvez você ache algo semelhante).
Você pode ver se no Java 7 isso vai estar implementado, caso você possa usar uma versão beta do Java 7 (disponível em http://download.java.net/jdk7 ). Veja o pacote java.nio.file : http://download.java.net/jdk7/docs/api/java/nio/file/package-summary.html
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2009 09:56:26
|
Sabatt
HelloWorld
Membro desde: 26/07/2009 08:03:02
Mensagens: 11
Offline
|
Realmente eu me expressei mal. Não precisa ser todos mas os principais..
Pq minha empresa tem um aplicativo que faz isso, só que ele está escrito em Delphi, e a gente tava querendo mudar para Java. E eu precisava descobrir um jeito de monitorar uma pasta pelo menos no windows e no linux, mas a solução que eu achei só funciona no windows.
Utilizar uma solução para cada SO com dll's parece ser meio complicado... Mas obrigado pelas respostas
This message was edited 1 time. Last update was at 28/07/2009 10:00:20
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/07/2009 13:50:05
|
lucamartins
JavaBaby
![[Avatar]](/images/avatar/16f26d49cfe75d6731a310494bf56f7d.jpg)
Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline
|
Cara, eu tenho algo que talvez possa ajudar.
Coloquei em anexo os dois arquivos principais para isso.
Descrito abaixo, temos o metodo main que está dentro do arquivo DirPoolingController.
Inicialmente instanciamos a classe DirPoolingController e passamos como parametro o diretorio que queremos monitorar. Se o diretório nao existir ou não for um diretório uma exceção é lançada. Após, adicionamos a lista de eventos a implementação da Interface FileActionListener, este evento será disparado toda vez que for encontrado um arquivo que esteja de acordo com o regex passado como parametro para DirPoolingController.peekPooling(String regex). (Se você não conhece de regex aqui no forum tem um tutorial só sobre isso). Este mesmo metodo pode ser chamado sem parametros, então, ele traz todos os arquivos do diretório.
O pulo do gato para usar esta classe é usa-la em conjunto com a classe Timer do pacote java.utils, aonde vc pode mandar monitorar a pasta de tempos em tempos, após isso, é só salvar o ultimo array retornado e fazer uma comparação mais profunda (Arrays.deepEquals), ae vc tem na mão os arquivos modificados e que atendam a alguma regra especifica em relação ao nome.
Para usar esta classe em linux vc deve colocar o path para o arquivo de uma forma que ele entenda, né?
Inté!
| Nome do arquivo |
FileActionListener.java |
Download
|
| Descrição |
|
| Tamanho |
361 bytes
|
| Baixado: |
198 vez(es) |
| Nome do arquivo |
DirPoolingController.java |
Download
|
| Descrição |
|
| Tamanho |
5 Kbytes
|
| Baixado: |
224 vez(es) |
This message was edited 1 time. Last update was at 31/07/2009 13:50:47
|
== The C Style old school == |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/07/2009 14:08:05
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Só lembrando que a classe do Luca não depende de SO, mas você deve usar um intervalo de "polling" razoavelmente alto (maior que 5 segundos, digamos), porque ela lista os arquivos dentro de um diretório, o que não é uma operação muito rápida em Java.
A monitoração "nativa" de diretórios (que, no Windows, é feita através das APIs listadas em Obtaining Directory Change Notifications é mais rápida e eficiente, mas obviamente só funciona em Windows e requer um pouco de programação nativa (C, normalmente).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/07/2009 14:17:15
|
lucamartins
JavaBaby
![[Avatar]](/images/avatar/16f26d49cfe75d6731a310494bf56f7d.jpg)
Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline
|
thingol wrote:Só lembrando que a classe do Luca não depende de SO, mas você deve usar um intervalo de "polling" razoavelmente alto (maior que 5 segundos, digamos), porque ela lista os arquivos dentro de um diretório, o que não é uma operação muito rápida em Java.
A monitoração "nativa" de diretórios (que, no Windows, é feita através das APIs listadas em Obtaining Directory Change Notifications é mais rápida e eficiente, mas obviamente só funciona em Windows e requer um pouco de programação nativa (C, normalmente).
Isto é verdade, no trabalho que participei do desenvolvimento esta foi a solução adotada. Eram gerados em média, 20.000 arquivos ao dia. No java, ele demorava alguns segundos para listar todos, no C era quase instantaneo. A solução adotada foi a de aumentar o tempo de pooling do diretório, mas o intervalo de 1s nos atendeu bem. Claro que vai depender de cada necessidade.
Foi legal você ter comentado isto, pois, sempre que chamar o peekPooling, DESATIVE o timer e volte a ativa-lo só depois do evento peekPerformed ter retornado. Assim pode-se evitar o pooling tão alto.
=)
P.S: Uma coisa importante, a classe limita a quantidade de arquivos retornados, por definição são 300 arquivos! Isto é parametrizado, pode-se escolher um limite qualquer. Não é validado um limite negativo, ele só não retorna nada!
This message was edited 2 times. Last update was at 31/07/2009 14:28:25
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2010 07:59:48
|
kotoko
Thread.start()
Membro desde: 23/04/2007 11:04:21
Mensagens: 36
Offline
|
Sei que este thread é já antigo mas peguei no código p experimentar e estou a ter o erro
quando uso o método addFileArraived.
Não tenho grande experiência a lidar com Listeners em Java confesso.
O que se passa?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2010 09:00:07
|
labavel
JavaTeenager
Membro desde: 03/09/2009 10:27:57
Mensagens: 172
Offline
|
e alguem sabe como moveria estas informaçoes para um banco de Dados ?
Tipo tenho um novo arquivo na pasta faz um insert para o banco com caminho que vai ser fixo nome hora e tamanho variavel ? para que o monitoramento fosse via JSP?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2010 11:22:22
|
lucamartins
JavaBaby
![[Avatar]](/images/avatar/16f26d49cfe75d6731a310494bf56f7d.jpg)
Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline
|
labavel, quais informações? As que estão dentro do arquivo que vc monitorou?
kotoko, vc poderia por gentileza postar parte do seu código?
|
== The C Style old school == |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2010 12:33:29
|
labavel
JavaTeenager
Membro desde: 03/09/2009 10:27:57
Mensagens: 172
Offline
|
Na realidade estou usando a seguinte função
Quero pegar tudo que estiver na pasta"nomes, data e horario, Tamanho" salvar os registros no banco. e depois excluir e mover os Dados
A função acima eu estou utilizando um time que a cada x segundos eu movimento os arquivos, porem com o post publicado posso adptalo para monitorar todos os arquivos por hora de imclusao
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2010 23:07:57
|
labavel
JavaTeenager
Membro desde: 03/09/2009 10:27:57
Mensagens: 172
Offline
|
eu reutilizei seu codigo utilizando um Timer
Alem do getName como eu pego a hora e o tamanho deste arquivo e gravo so os registros no Banco ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/05/2010 08:57:46
|
lucamartins
JavaBaby
![[Avatar]](/images/avatar/16f26d49cfe75d6731a310494bf56f7d.jpg)
Membro desde: 30/04/2008 15:17:55
Mensagens: 78
Offline
|
labavel, o código serve simplesmente para retornar os arquivos que se encaixam na expressão regular passada para a classe DirPoolingController, vc deve usar o timer na sua classe e agendar uma tarefa, assim que o timer chamar o metodo run da classe TimerTask vc deve chamar o metodo peekPooling.
Agora, é só pesquisar sobre Timer e TimeTask e usa-los em conjunto com a classe DirPoolingController.
Cara, esse seu código acima pode ser substituido por , mas lembre-se que uma condição de parada é importante para o laço, ainda mais se ele estiver rodado na thread principal.
Alguns sites para vc ver como pegar o tamanho do arquivo, a data de criação e o conteúdo.
http://www.exampledepot.com/egs/java.io/getlength.html
http://www.javadb.com/get-file-size
http://java.sun.com/docs/books/tutorial/essential/io/file.html
At
This message was edited 2 times. Last update was at 06/05/2010 09:05:43
|
== The C Style old school == |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2010 13:30:45
|
dheza
Smalltalk
Membro desde: 11/05/2010 10:50:10
Mensagens: 2
Offline
|
Oi Pessoal,
Vou utilizar o codigo que vcs postaram, só estou com 1 dúvida, devo colocar isso em uma thread?
Obrigada
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/11/2010 17:24:44
|
fabiofalci
GUJ Master
![[Avatar]](/images/avatar/c359889a833e7612e0cff1dc69d272bc.png)
Membro desde: 11/04/2006 09:23:14
Mensagens: 1057
Localização: Porto Alegre - RS
Offline
|
Uma opção é essa api da apache.
http://commons.apache.org/jci/
Apesar de ter um propósito diferente, ela tem uma classe
Que talvez te ajude.
Essa classe aqui tem um exemplo de uso: https://github.com/fabiofalci/unloading-java-class/blob/instrument/src/instrument/SimpleTransformer.java
|
|
|
 |
|
|