OVH Cloud OVH Cloud

Détecter la modification d'un fichier

11 réponses
Avatar
Nicolas Vervelle
Bonjour,

j'ai cherché dans l'api java et dans les messages du forum, mais je n'ai pas
trouvé.
Y a t'il un moyen de détecter la modification du contenu d'un fichier par
une autre application ?

En fait, j'ai un programme qui tourne sur ma machine (je n'ai pas les
sources) et qui met à jour le contenu d'un fichier. Je veux faire un autre
programme qui, entre autres, affiche le contenu du fichier et qui met à jour
l'affichage à chaque modification du fichier.

Merci
Nicolas

10 réponses

1 2
Avatar
Unknown
Le Sun, 13 Jun 2004 17:44:53 +0200, Nicolas Vervelle a écrit :


C'est une façon de faire mais j'aurais préféré pouvoir faire de
l'evenementiel.
Je risque d'avoir un certain nombre de fichiers à surveiller (une centaine)
sur des machines différentes donc avec accès réseau.
Je ferais un essai.


N'oublions pas que Java s'appuie sur le systeme de fichier de l'OS.
Si ce systeme de fichier n'est pas évenementiel comment java pourrait le
remplacer ?

Avatar
Bruno Tignac
Nicolas Vervelle wrote:

Salut,

Oui, cela peut etre fait.

Il n'y a pas effectivement de "systeme evenementiel" dans l'API pour
detecter la modification, mais c'est tres simple a faire :

tu ecris un thread qui toutes les N millisecondes va verifier l'etat de ton
fichier en utilisant lastModified() de File. Si le long que tu obtiens est
different de celui que tu as obtenu le coup d'avant c'est que le fichier
a ete modifie.

Exemple de classe de verif :

import java.io.File;

public class Test implements Runnable {
private File coFile;

public Test (File poFile) {
coFile = poFile;
}
public void run() {
long llLastModified= 0;
try {
llLastModified = coFile.lastModified();
}catch(Exception loEx){
}
while (true) {
try {
// on dort une minute
Thread.sleep(1000*60);
// on verifie la date
long llNewModified = coFile.lastModified();
if (llNewModified > llLastModified){
//appeler le traitement qu'il faut
llLastModified = coFile.lastModified();
}
} catch(Exception loEx) {
loEx.printStackTrace();
}
}
}
}

Voila a peu pres l'idee.

Bruno
Bonjour,

j'ai cherché dans l'api java et dans les messages du forum, mais je n'ai
pas trouvé.
Y a t'il un moyen de détecter la modification du contenu d'un fichier par
une autre application ?

En fait, j'ai un programme qui tourne sur ma machine (je n'ai pas les
sources) et qui met à jour le contenu d'un fichier. Je veux faire un autre
programme qui, entre autres, affiche le contenu du fichier et qui met à
jour l'affichage à chaque modification du fichier.

Merci
Nicolas


Avatar
Nicolas Vervelle
C'est une façon de faire mais j'aurais préféré pouvoir faire de
l'evenementiel.
Je risque d'avoir un certain nombre de fichiers à surveiller (une centaine)
sur des machines différentes donc avec accès réseau.
Je ferais un essai.

Merci

"Bruno Tignac" a écrit

Il n'y a pas effectivement de "systeme evenementiel" dans l'API pour
detecter la modification, mais c'est tres simple a faire :

tu ecris un thread qui toutes les N millisecondes va verifier l'etat de
ton

fichier en utilisant lastModified() de File. Si le long que tu obtiens est
different de celui que tu as obtenu le coup d'avant c'est que le fichier
a ete modifie.

Y a t'il un moyen de détecter la modification du contenu d'un fichier
par


une autre application ?





Avatar
Nicolas Vervelle
"Unknown" a écrit dans le message de
news:


C'est une façon de faire mais j'aurais préféré pouvoir faire de
l'evenementiel.
Je risque d'avoir un certain nombre de fichiers à surveiller (une
centaine)


sur des machines différentes donc avec accès réseau.
Je ferais un essai.


N'oublions pas que Java s'appuie sur le systeme de fichier de l'OS.
Si ce systeme de fichier n'est pas évenementiel comment java pourrait le
remplacer ?



Dans Windows, il y a les fonctions FindFirstChangeNotification() et consort
qui permettent de faire çà.
Pour les autres OS, je ne sais pas.


Avatar
Patrick Godeau
Nicolas Vervelle a écrit:
C'est une façon de faire mais j'aurais préféré pouvoir faire de
l'evenementiel.
Je risque d'avoir un certain nombre de fichiers à surveiller (une centaine)


S'ils sont dans un même répertoire, ce sera + efficace de tester l'état
du répertoire lui-même.

Avatar
Vincent Lascaux
N'oublions pas que Java s'appuie sur le systeme de fichier de l'OS.
Si ce systeme de fichier n'est pas évenementiel comment java pourrait le
remplacer ?


Voyons voir... peut être créer un thread et tester toutes les N
millisecondes si l'etat du fichier a changé ? ;-)

--
Vincent

Avatar
jocelyn
Salut,

Je ne connais pas l'API windows, mais si cette methode existe, peut-etre
peux-tu envisager
de passer par JNI ?

--
Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne
pas devenir un monstre lui-même

Dans Windows, il y a les fonctions FindFirstChangeNotification() et
consort

qui permettent de faire çà.
Pour les autres OS, je ne sais pas.




Avatar
christophe

Nicolas Vervelle wrote:

Salut,

Oui, cela peut etre fait.

Il n'y a pas effectivement de "systeme evenementiel" dans l'API pour
detecter la modification, mais c'est tres simple a faire :

tu ecris un thread qui toutes les N millisecondes va verifier l'etat de ton
fichier en utilisant lastModified() de File. Si le long que tu obtiens est
different de celui que tu as obtenu le coup d'avant c'est que le fichier
a ete modifie.

Exemple de classe de verif :

import java.io.File;

public class Test implements Runnable {
private File coFile;

public Test (File poFile) {
coFile = poFile;
}
public void run() {
long llLastModified= 0;
try {
llLastModified = coFile.lastModified();
}catch(Exception loEx){
}
while (true) {
try {
// on dort une minute
Thread.sleep(1000*60);
// on verifie la date
long llNewModified = coFile.lastModified();
if (llNewModified > llLastModified){
//appeler le traitement qu'il faut
llLastModified = coFile.lastModified();
}
} catch(Exception loEx) {
loEx.printStackTrace();
}
}
}
}

Voila a peu pres l'idee.

Bruno


juste une question:
en faisant une boucle infinie, est ce qu'on ne monopolyse pas le cpu?
si oui, est ce que le thread.sleep la relache?

Avatar
Bruno Tignac
Salut,

Comme l'indique le terme Thread.sleep() relache le thread. En fait, il fait
une attente passive. L'ordonnanceur du systeme d'exploitation se chargeant
de le reveiller quand il faut.

Le compotement du Thread.sleep est a rapprocher de Object.wait() ou le
notify serait remonte par la VM.

Bruno

christophe wrote:


Nicolas Vervelle wrote:

Salut,

Oui, cela peut etre fait.

Il n'y a pas effectivement de "systeme evenementiel" dans l'API pour
detecter la modification, mais c'est tres simple a faire :

tu ecris un thread qui toutes les N millisecondes va verifier l'etat de
ton fichier en utilisant lastModified() de File. Si le long que tu
obtiens est different de celui que tu as obtenu le coup d'avant c'est que
le fichier a ete modifie.

Exemple de classe de verif :

import java.io.File;

public class Test implements Runnable {
private File coFile;

public Test (File poFile) {
coFile = poFile;
}
public void run() {
long llLastModified= 0;
try {
llLastModified = coFile.lastModified();
}catch(Exception loEx){
}
while (true) {
try {
// on dort une minute
Thread.sleep(1000*60);
// on verifie la date
long llNewModified = coFile.lastModified();
if (llNewModified > llLastModified){
//appeler le traitement qu'il faut
llLastModified = coFile.lastModified();
}
} catch(Exception loEx) {
loEx.printStackTrace();
}
}
}
}

Voila a peu pres l'idee.

Bruno


juste une question:
en faisant une boucle infinie, est ce qu'on ne monopolyse pas le cpu?
si oui, est ce que le thread.sleep la relache?



Avatar
Pasturel Jean-Louis
Nicolas Vervelle wrote:
Bonjour,

j'ai cherché dans l'api java et dans les messages du forum, mais je n'ai pas
trouvé.
Y a t'il un moyen de détecter la modification du contenu d'un fichier par
une autre application ?

En fait, j'ai un programme qui tourne sur ma machine (je n'ai pas les
sources) et qui met à jour le contenu d'un fichier. Je veux faire un autre
programme qui, entre autres, affiche le contenu du fichier et qui met à jour
l'affichage à chaque modification du fichier.

Merci
Nicolas


Chercher du coté du pattern Observer / Observable en derivant File et en

retroussant les manches ;-)

1 2