IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Indexation permanente d'un serveur de fichiers


Sujet :

Java

  1. #21
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Voici le code permettant d'écouter un répertoire (merci à tchize_ )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    import java.io.IOException;
    import java.nio.file.FileSystem;
    import java.nio.file.FileSystems;
    import java.nio.file.Path;
    import java.nio.file.StandardWatchEventKinds;
    import java.nio.file.WatchEvent;
    import java.nio.file.WatchKey;
    import java.nio.file.WatchService;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    public class Test {
        public static void main(String args[]) throws InterruptedException {
            try {
                FileSystem fs = FileSystems.getDefault();
                WatchService ws = null;
                try {
                    ws = fs.newWatchService();
                } catch (IOException ex) {
                    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                }
                Path path = fs.getPath("D:\\");
                path.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW, StandardWatchEventKinds.ENTRY_DELETE);
     
                WatchKey k = ws.take();
     
                for (WatchEvent object : k.pollEvents()) {
                    if (object.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                        System.out.println("Modify: " + object.context().toString());
                    }
                    if (object.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                        System.out.println("Delete: " + object.context().toString());
                    }
                    if (object.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                        System.out.println("Created: " + object.context().toString());
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    Ils me reste 2 petits problèmes néanmoins :
    - ce code n'écoute pas les sous répertoires de D:/ (si je créer un fichier dans D:/mondossier/monfichier.txt, il ne le vois pas)
    - dès qu'il detecte un ajout/suppression/modification, le programme s'arrête. Idéalement il devrait tourner indéfiniement...

    J'ai sûrement omis un détail ?

  2. #22
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    1) ça watch un répertoire, si il y a des sous répertoires, il faut les watcher aussi.
    2) comme le dit la doc fournie en lien, il faut faire:

    Here are the basic steps required to implement a watch service:

    Créer un watchservice pour le système de fichiers
    Pour chaque dossier, l'enregistrer, on recoi un watchkey
    Créer un boucle infinie, la clé est signalée et mise dans la queue
    Récupérer la clé depuis la queue, le nom de fichier est dans la clé
    Récupérer tous les évènements en attente pour la clé
    Faire un reset de la clé et recommencer à attendre les évènements
    Ton code devrais donc être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
       while(true){
                WatchKey k = ws.take();
     
                for (WatchEvent object : k.pollEvents()) {
                    if (object.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                        System.out.println("Modify: " + object.context().toString());
                    }
                    if (object.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                        System.out.println("Delete: " + object.context().toString());
                    }
                    if (object.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                        System.out.println("Created: " + object.context().toString());
                    }
                }
                boolean valid = k.reset();
                if (!valid){
                    // la cle n'est plus enregistrée
                }
       }

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    En effet, ça marche beaucoup mieux, un grand merci !

    Quelques remarques néanmoins :
    - Si je copie/colle un fichier, j'ai une création et 2 modifications dans ma console. Je suppose qu'en lisant le fichier d'origine, Windows doit faire une opération interprété comme une modification par le Watchservice...
    - Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    path.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW, StandardWatchEventKinds.ENTRY_DELETE);
    est-il possible de faire une sorte de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dir.register(ws, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW, StandardWatchEventKinds.ENTRY_DELETE);
    ou Dir serait une ArrayList de mes répertoire ramenés récursivements comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private static void essai(File f){	
    	if (f.isDirectory())
    	{
    		Dir.add(f);
    		File[] liste_fils = f.listFiles();
    		if(liste_fils!=null)
    		{
    			for(int i=0;i<liste_fils.length;i++)
    			{
    				essai(liste_fils[i]);		
    			}
    		}
    	}
    }
    (j'essais d'éviter la répétition de code le plus possible)

  4. #24
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (File directory: Dir)
      directory.getPath().register(
              ws, 
              StandardWatchEventKinds.ENTRY_CREATE, 
              StandardWatchEventKinds.ENTRY_MODIFY, 
              StandardWatchEventKinds.OVERFLOW, 
              StandardWatchEventKinds.ENTRY_DELETE);

  5. #25
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Boucler sur chacun de mes répertoires, en effet c'est ce qu'il y à de plus simple.
    Néanmoins si je créer un nouveau fichier quelque part dans mon arborescence écoutée, il ne sera pas écouter...

    Je pense qu'il faudrait créer une sorte d'actualisation de notre liste de répertoire écouté avec quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (object.kind() == StandardWatchEventKinds.ENTRY_CREATE) 
    {
             Path NewDir = fs.getPath(object.context().toString());
             NewDir.register(ws, 
                      StandardWatchEventKinds.ENTRY_CREATE,                              
                      StandardWatchEventKinds.ENTRY_MODIFY, 
                      StandardWatchEventKinds.OVERFLOW, 
                      StandardWatchEventKinds.ENTRY_DELETE);
    }
    idem si on change le nom du répertoire, et idem si on le supprime...

  6. #26
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    La doc donne tout de même l'avertissement suivant:


    When to Use and Not Use This API

    The Watch Service API is designed for applications that need to be notified about file change events. It is well suited for any application, like an editor or IDE, that potentially has many open files and needs to ensure that the files are synchronized with the file system. It is also well suited for an application server that watches a directory, perhaps waiting for .jsp or .jar files to drop, in order to deploy them.
    This API is not designed for indexing a hard drive. Most file system implementations have native support for file change notification. The Watch Service API takes advantage of this support where available. However, when a file system does not support this mechanism, the Watch Service will poll the file system, waiting for events.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #27
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (File directory: Dir)
      directory.getPath().register(
              ws, 
              StandardWatchEventKinds.ENTRY_CREATE, 
              StandardWatchEventKinds.ENTRY_MODIFY, 
              StandardWatchEventKinds.OVERFLOW, 
              StandardWatchEventKinds.ENTRY_DELETE);
    Juste pour info : directory.getPath().register() ne marche pas, la méthode register ne peut s'appliquer que sur un objet de type path et directory.getPath() est de type String...

    ma version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(int i=0;i<Dir.size();i++)
    {
        Path  path = fs.getPath(Dir.get(i).toString());
        path.register(ws, 
              StandardWatchEventKinds.ENTRY_CREATE, 
              StandardWatchEventKinds.ENTRY_MODIFY, 
              StandardWatchEventKinds.OVERFLOW, 
              StandardWatchEventKinds.ENTRY_DELETE); 
    }

  8. #28
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par sinok Voir le message
    La doc donne tout de même l'avertissement suivant:
    En meme temps, la doc dit qu'au pire, elle fait du pulling et c'est deja ce qui est fait donc...

  9. #29
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    l'avertissement sur l'indexation, c'est surtout que t'aura aucune notification sur ce qui s'est passé pendant l'arret de ton application

  10. #30
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    A tous : j'ai 2 questions à vous poser pour faire améliorer l'écoute d'une arborescence complète :

    1) Existe-t-il une methode du genre remove() ou change() sur mon objet de type WatchService ? Je ne trouve rien. Pourtant dans le cas ou je supprime ou renomme un répertoire, il est nécessaire de l'enlever à ma liste d'écoute ou de changer son nom...
    Si cette méthode n'est pas implémentée, ma solution serait de détruire (ou vider) mon objet et de re-parcours les répertoires récursivement à nouveau.
    Qu'en pensez-vous ?

    2) Pourquoi je perd la moitié de mes informations sur mon objet de type File ?
    Avec ce code par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    while(true){
        WatchKey k = ws.take();
     
        for (WatchEvent object : k.pollEvents()) {
     
            WatchEvent<Path> ev = (WatchEvent<Path>)object;
            Path PathTemp = ev.context();
            File FileChange = new File(PathTemp.toAbsolutePath().toString());
            System.out.println("Nom: "+FileChange.getName()+
            		"Chemin:"+FileChange.getAbsolutePath()+
            		"Dernière modification: "+FileChange.lastModified()+
            		"Est un répertoire: "+FileChange.isDirectory());
    boolean valid = k.reset();
    if (!valid){
        System.out.println("la cle n'est plus enregistrée");
    }
    Ici, j'ai bien les propriétés de noms et de chemins mais lastModified est toujours égal à 0 et isDirectory est toujours False
    Pour ajouter un répertoire à ma liste d'écoute, il me faut la propriété isDirectory() :/

    ps: tchize_, peux-tu m'expliquer à quoi sert cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    boolean valid = k.reset();
    if (!valid){
        System.out.println("la cle n'est plus enregistrée");
    }
    Un simple k.reset(); aurait suffit non ? Puisqu'on ne rentre jamais dans le if je pense... Merci !

  11. #31
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Je pense savoir pourquoi je ne peux récupérer un objet de type File valide :
    Habituellement le service d'écoute utilise 1 répertoire, par exemple "D:/", et les informations renvoyés par ce service sont le nom uniquement.
    Ainsi, on peut récupérer le chemin complet du fichier ayant était modifié par une concaténation tout simple, ou bien comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // chemin à écouter
    Path dir = "D:/";
    // ajout du répertoire au service d'écoute
    WatchKey key = dir.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
    while(true){
                    WatchKey k = ws.take();
                    for (WatchEvent object : k.pollEvents()) {
                                    // traitement du résultat
                                    WatchEvent<Path> ev = (WatchEvent<Path>)event;
                                    Path filename = ev.context();
                                    Path child = dir.resolve(filename);
                    }
    }
    Or dans mon cas, je n'ajoute pas 1 mais une multitude de résultat grâce à une fonction récursive qui parcours mon arborescence.
    J'ai donc bien le nom du fichier qui à bouger (dans l'objet "object" de type WatchEvent), mais pas l'information du répertoire dans lequel il se trouve est quelque part dans mon service d'écoute...

    J'ai bien regarder la doc, il n'y à aucune méthode dans la classe WatchEvent qui ramène le chemin absolue du fichier qui à bouger...

  12. #32
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est parce que cette information est liée à la watchkey. Chaque fois que vous ajouter une dossier ou une fichier dans le watchservice, on vous fournis un watchkey. Sur le watchkey, vous pouvez faire watchable() qui va vous retourner le Path que vous avez fournis au départ.

    Mais normalement le Path retourné par l'event devrait être complet

    aussi pour passer de path à file, je préfèrererais l'usage de toFile.

  13. #33
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    C'est parce que cette information est liée à la watchkey. Chaque fois que vous ajouter une dossier ou une fichier dans le watchservice, on vous fournis un watchkey. Sur le watchkey, vous pouvez faire watchable() qui va vous retourner le Path que vous avez fournis au départ.
    Bien vu tchize !
    Voici donc comment je récupère mon chemin absolu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(true){
        WatchKey key = ws.take();
     
        for (WatchEvent<?> event: key.pollEvents()) 
        {
        	WatchEvent.Kind<?> kind = event.kind();
        	Path path = fs.getPath(key.watchable().toString(), event.context().toString());
        }
    Après, en effet un path.toFile().isDirectory() me permet de récupérer les informations dont j'ai besoin.


    Par contre, personne ne m'a répondu :
    - Peut-on changer/supprimer un des répertoires de notre liste d'écoute. Quelque chose du genre WatchService ws.remove(chemin de mon repertoire) ?
    - tchize : pourquoi utiliser if (!valid){System.out.println("la cle n'est plus enregistrée");} dans ton précédent code ?

  14. #34
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    1) watchkey.cancel()
    2) parce que ca veux dire que le watchservice ne surveillera plus. Exemple: tu surveille le fichier machin.txt, tu recois un event machin.txt a été effacé. Forcément, par la suite, il n'y a plus rien à surveiller donc la watchkey associée n'est plus valide.

  15. #35
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    1) watchkey.cancel()
    2) parce que ca veux dire que le watchservice ne surveillera plus. Exemple: tu surveille le fichier machin.txt, tu recois un event machin.txt a été effacé. Forcément, par la suite, il n'y a plus rien à surveiller donc la watchkey associée n'est plus valide.
    1) Parfait !
    Donc pour ajouter un répertoire, je re-rentre dans ma fonction récursive d'ajout au Watchservice, pour supprimer watchkey.cancel() et pour renommé, je le supprime et je ré-ajoute le nouveau

    2) Ok j'ai compris, ça permet de faire un reset() de la clés sans courir le risque que le programme plante parce que la clés a reseter n'existe plus. C'est malin

    Bon, bah résolu !

    Un grand merci à tchize en tout cas !

  16. #36
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Petite question au cas ou :

    Si je supprime un dossier, je le retire de la liste d'écoute. Pour tester s'il s'agit d'un dossier je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Path path = fs.getPath(key.watchable().toString(), event.context().toString());
    if (path.toFile().isDirectory()){
    key.cancel();
    }
    Or, le dossier n'existant plus (puisqu'il vient d'être supprimer), le code path.toFile().isDirectory() sera toujours égale à False


    Citation Envoyé par tchize_ Voir le message
    1) watchkey.cancel()
    key.cancel() enlève de la liste d'écoute le répertoire père, pas le dossier que je viens de supprimer. Exemple :
    Si je supprime D:\MonRep\MonRep2, alors ça enlève de la liste d'écoute D:\MonRep
    Ainsi je ne peux plus écouter les nouvelles créations dans D:\MonRep

  17. #37
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ca enlève la clé que vous avez enregistré. si la clé correspond au père, de fait, c'est le père qui est retiré. A vous de faire une petite maintenance de votre liste de clés pour vous y retrouver

  18. #38
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il y a quelque chose que je ne comprend pas dans ton code du premier message de cette page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	try {
    		...
     
    		WatchService ws = null;
    		try {
    			ws = fs.newWatchService();
    		} catch (IOException ex) {
    			Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    		}
     
    		...
     
    	} catch (IOException e) {
    		 Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    	}
    Pourquoi y-a-t-il un double try/catch sur la création du WatchService ??? Pourquoi ne pas laisser remonter directement dans le premier try/catch qui stoppera bien tout le traitement ???




    Citation Envoyé par BobbyWeb Voir le message
    Après, en effet un path.toFile().isDirectory() me permet de récupérer les informations dont j'ai besoin.
    Pourquoi continuer à utiliser java.io.File ? Le package java.nio.file te permet tout autant de chose, et même plus encore...

    La manipulation des fichiers se fait via les méthodes static de la classe Files, ainsi dans ton cas autant faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean isDir = Files.isDirectory( path );



    [edit] Et tu n'as pas besoin de gérer la "suppression" d'un répertoire du WatchService. C'est géré automatiquement...


    a++

  19. #39
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Pourquoi y-a-t-il un double try/catch sur la création du WatchService ??? Pourquoi ne pas laisser remonter directement dans le premier try/catch qui stoppera bien tout le traitement ???
    C'est vrai, ce n'ais pas obligatoire. Je me suis aider d'un tuto qui créé ce try/catch, je l'ais simplement repris... En même temps, il permet de bien voir à quel endroit mon code à planter.


    Citation Envoyé par adiGuba Voir le message
    Pourquoi continuer à utiliser java.io.File ? Le package java.nio.file te permet tout autant de chose, et même plus encore...
    La manipulation des fichiers se fait via les méthodes static de la classe Files, ainsi dans ton cas autant faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean isDir = Files.isDirectory( path );
    J'en prend note, et j'optimise mon code, merci !


    Citation Envoyé par adiGuba Voir le message
    Et tu n'as pas besoin de gérer la "suppression" d'un répertoire du WatchService. C'est géré automatiquement...
    Es-tu sûr de cela ? Je n'ais rien vu de tel dans la doc. Si c'est bien le cas, nombreux de mes problèmes viennent de se résoudre

    Citation Envoyé par tchize_ Voir le message
    A vous de faire une petite maintenance de votre liste de clés pour vous y retrouver
    Pas si simple que cela : si je renomme un fichier, mon programme me renvoi une suppression + une création
    De même, si je modifie un fichier, je reçois 2 modifications du fichier + 1 modification du répertoire père...

    Donc si je choisis de ne pas prendre en compte la modification du répertoire père par exemple, mais qu'à ce même moment un autre utilisateur modifie ce répertoire, alors je suis incapable de faire la distinction entre ces deux cas. Je dois donc tenir compte de tous les évènements...

    Autre problème les amis :
    Si je remplace le répertoires "D:\\MonRep" de test par quelque chose de plus volumineux comme "c:\\" , j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    java.nio.file.AccessDeniedException: c:\System Volume Information
    	at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
    	at sun.nio.fs.WindowsException.asIOException(Unknown Source)
    	at sun.nio.fs.WindowsWatchService$Poller.implRegister(Unknown Source)
    	at sun.nio.fs.AbstractPoller.processRequests(Unknown Source)
    	at sun.nio.fs.WindowsWatchService$Poller.run(Unknown Source)
    	at java.lang.Thread.run(Unknown Source)
    Je pense que cela vient du fait que ma variable WatchService ws contient un nombre d'information plus grand que l'allocation mémoire accordée à une variable, non ?

    Je me dis que c'est pas grave car sur mon serveur, j'ai beaucoup de fichiers, mais pas autant de répertoires. Seulement lorsque j'écoute tous les répertoires dans "\\\\MonServeur\\MesFichiers", j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    java.io.IOException: The network BIOS command limit has been reached.
     
    	at sun.nio.fs.WindowsWatchService$Poller.implRegister(Unknown Source)
    	at sun.nio.fs.AbstractPoller.processRequests(Unknown Source)
    	at sun.nio.fs.WindowsWatchService$Poller.run(Unknown Source)
    	at java.lang.Thread.run(Unknown Source)
    La je suis perdu...
    D'après ceci : http://support.microsoft.com/kb/810886 il faudrait changer la configuration du serveur ???

  20. #40
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Ps : voici mon programme actuel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    import java.io.File;
    import java.io.IOException;
    import java.nio.file.FileSystem;
    import java.nio.file.FileSystems;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.StandardWatchEventKinds;
    import java.nio.file.WatchEvent;
    import java.nio.file.WatchKey;
    import java.nio.file.WatchService;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    public class Test {
     
    	private static FileSystem fs = FileSystems.getDefault();
    	private static WatchService ws = null;
     
    	private static void essai(File f) throws IOException{	
    		if (f.isDirectory())
    		{
    			Path  path = fs.getPath(f.getAbsolutePath());
    			path.register(ws, 
    					StandardWatchEventKinds.ENTRY_CREATE, 
    					StandardWatchEventKinds.ENTRY_MODIFY, 
    					StandardWatchEventKinds.OVERFLOW, 
    					StandardWatchEventKinds.ENTRY_DELETE); 
     
    			File[] liste_fils = f.listFiles();
    			if(liste_fils!=null)
    			{
    				for(int i=0;i<liste_fils.length;i++)
    				{
    					essai(liste_fils[i]);
    				}
    			}
    		}
    	}
     
    	public static void main(String args[]) throws InterruptedException {
    		try {
    			ws = fs.newWatchService();
     
    			// Repertoire fictif, sécurité oblige...
    			essai(new File("\\\\MonServeur\\MesFichiers"));
    			System.out.println("Ajout des répertoires terminés");
     
    			while(true){
    				WatchKey key = ws.take();
     
    				for (WatchEvent<?> event: key.pollEvents()) {
    					WatchEvent.Kind<?> kind = event.kind();
    					Path path = fs.getPath(key.watchable().toString(), event.context().toString());
     
    					if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
    						if (!Files.isDirectory(path)){
    							System.out.println("Created : "+path.toFile().getAbsolutePath());
    						}
    						else {
    							essai(path.toFile());
    							System.out.println(path.toFile().getAbsolutePath()+ " ajouté à la liste d'écoute");
    						}
    					}
     
    					if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
    						if (!Files.isDirectory(path)){
    							System.out.println("Modify : "+path.toFile().getAbsolutePath());
    						}
    					}
     
    					if (kind == StandardWatchEventKinds.ENTRY_DELETE) {	
    						System.out.println("Delete : " +path.toAbsolutePath());
    					}
    				}
    				boolean valid = key.reset();
    				if (!valid){
    					//System.out.println("la cle n'est plus enregistrée");
    				}
    			}
    		} catch (IOException ex) {
    			Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    		}
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Fichier d'index avec HTACCES sur serveur IIS
    Par alas70 dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 26/07/2009, 20h35
  2. [Reseau] Serveur de fichier, domaine interne, firewall, back
    Par nico33307 dans le forum Développement
    Réponses: 2
    Dernier message: 01/09/2005, 15h38
  3. Serveur de fichier Samba - problème accès Win XP
    Par rohstev dans le forum Réseau
    Réponses: 2
    Dernier message: 10/06/2005, 08h10
  4. Mise en place d'un serveur de fichier Samba/RedHat
    Par shaun_the_sheep dans le forum Réseau
    Réponses: 2
    Dernier message: 11/01/2005, 08h22
  5. Serveur de fichier Linux
    Par MrEddy dans le forum Réseau
    Réponses: 3
    Dernier message: 07/04/2004, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo