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 :

Fonction récursive sur le parcours d'une arborescence


Sujet :

Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Fonction récursive sur le parcours d'une arborescence
    Bonjour, je dois réaliser un logiciel en langage java qui retrouve les fichiers de type odt contenu dans un dossier. Je souhaite donc que, lorsque l'on selectionne un dossier, un message d'erreur s'affiche si le dossier ne contient aucun fichier de type odt. J'ai donc créer deux fonctions :
    - une qui verifie que mon adresse est valide,
    - et une autre qui vérifie si le dossier contient des fichiers .odt.

    Voici leur code :
    Code Java : 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
    public boolean adresseValide(Path adresse, JLabel message) {
      try {
        if (!Files.isDirectory(adresse)) {
          message.setText("L'adresse ne renvoie pas à un répertoire existant");
          message.setForeground(Color.RED);
        } else if (!Files.isReadable(adresse)) {
          message.setText("Le dossier n'est pas lisible");
          message.setForeground(Color.RED);
        } else if (!dossierContientODT(adresse)) {
          message.setText("Le dossier ne contient aucun fichier .odt");
          message.setForeground(Color.RED);
        } else {
          message.setText("Adresse valide");
          message.setForeground(Color.BLACK);
          return true;
        }
      } catch (IOException e) {
        message.setText("Vérifier le format de l'adresse ou l'existence de votre dossier");
        message.setForeground(Color.RED);
        e.getMessage();
      }
      return false;
    }
     
    public boolean dossierContientODT(Path adresse) throws IOException {
      try {
        DirectoryStream<Path> stream = Files.newDirectoryStream(adresse);
        Iterator<Path> it = stream.iterator();
        while (it.hasNext()) {
          Path path = it.next();
          if (Files.isDirectory(path)) {
            dossierContientODT(path);
          } else {
            int position;
            position = String.valueOf(path.getFileName()).lastIndexOf(".");
            if (position > -1 && String.valueOf(path.getFileName()).substring(position).equals(".odt")) {
              return true;
            }
          }
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
      return false;
    }

    J'ai cherché sur internet, et relu plusieurs fois mon code, mais je n'arrive pas à faire ce que je veux : je veux vérifier si les fichiers de mon dossier sont des .odt mais aussi si les fichiers des sous-dossier de mon dossier sont des .odt . Je pensais qu'en faisant un appel récursif comme je l'ai fait, cela suffirai mais apparemment non.
    Merci d'avance pour l'aide que vous me fournirez.

  2. #2
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Slt,

    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
     
    List<File> filesOdt = new ArrayList<File>();
    public static void dossierContientODT(String emplacement) {
    		File fileP = new File(emplacement);
    		if (fileP.exists()) {
    			File[] files = fileP.listFiles();
    			for (File file : files) {
    				if (file.isDirectory()) {
    					dossierContientODT(fileP.getPath() + "\\" + file);
    				}else if(file.getName().endsWith(".odt")){
                                            filesOdt.add(file);
    					LOG.info("fichier odt trouvé");
    				}
    			}
    		}
    	}
    Pas testé mais l'idée est là... sinon pour ton code je n'ai pas eu le temps de le tester mais ça reprend les mêmes principes, tu devrais peut être nous dire quelles sont tes erreurs, problèmes...
    Bon courage

    ++
    "Aucun de nous ne sait ce que nous savons tous, ensemble."
    Lien vers mon appli Funcash n'hésitez pas à donner votre avis

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Je dois réalisé mon code avec java.nio et pas java.io.
    J'ai essayer d'utiliser la méthode endwith() mais sans succès.

    Mon problème est le suivant : j'arrive à vérifier si les fichiers contenu dans mon dossier sont de type odt ou non, mais pas à vérifier ceux contenus dans les sous-dossiers de mon dossier.
    Par exemple si j'ai un fichier odt dans un dossier 'Projet' qui lui-même appartient au dossier 'Mes documents', lorsque je vérifie si mon dossier 'Projet' contient des fichiers odt, je trouve bien mon fichier odt, mais si je vérifie pour mon dossier 'Mes documents', mon message d'erreur s'affiche m’expliquant que ce dossier ne contient aucun fichier odt.

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Bonjour et bienvenue sur le forum,


    Le seul problème que je constate c'est que tu ne vérifies pas la valeur de retour de ton appel récursif (ligne 32).
    Pour simplifier j'écrirai une boucle dans ce genre :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    boolean contient = false;
    Iterator<Path> iterator = ...;
    while (!contient && iterator.hasNext()) {
      Path child = iterator.next();
      if (Files.isDirectory(child)) {
        contient = /* appel récursif */
      } else {
        contient = /* vérifier le nom */
      }
    }
    return contient;

    Quelques autres petites choses :
    1. Pour des questions de performance, je te conseille de d'abord de vérifier tous les fichiers qui ne sont pas des répertoires pour éviter de fouiller toute l'arborescence.
    2. Pour verifier l'extension d'un fichier, tu peux utiliser endsWith (mais attention à la casse !). Sinon il y a regionMatches , toLowerCase ou bien les expressions régulières.
    3. Tu indiques que ta méthode peut lancer une IOException alors qu'elles sont toutes capturées.
    4. "Path" n'est pas une "adresse" mais un "chemin".
    5. ATTENTION, DirectoryStream est une ressource et doit être fermée proprement. Le mieux étant d'utiliser un bloc "try-with-resources" :
      Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
       // itérer avec un iterator ou une boucle for-each
      }
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour votre aide, j'ai résolu mon problème grâce à vous ! Bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcours d'une arborescence sans repasser par un meme fichier
    Par JMLLB dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/06/2009, 16h04
  2. fonction récursive sur string
    Par Jasmine80 dans le forum Langage
    Réponses: 18
    Dernier message: 15/07/2008, 10h09
  3. performance sur le parcours d'une arborescence
    Par garzouille dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 15/05/2007, 13h58
  4. Réponses: 3
    Dernier message: 26/12/2006, 11h34
  5. [VBA-A]Parcours d'une arborescence dossiers et fichiers
    Par sidneyvba dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/03/2006, 16h58

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