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

Entrée/Sortie Java Discussion :

Parcourir arborescence fichier et répertoire


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut Parcourir arborescence fichier et répertoire
    Bonsoir,

    Pourriez vous m'aider à y voir plus clair, il semblerait que cette fonction censée me dire si un fichier se trouve dans mon arborescence ou pas ne fonctionne pas comme je le voudrais.


    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
     
    public boolean fileExist(String path){
    		File rep=new File(path);
    		String[] listeFile=rep.list();
    		int k;
    		int nbDir=0;
    		boolean test=false;
    		if(this.exists()){
    			return true;
    		}else{ // on parcours la liste de sous fichiers
    			for(k=0;k<listeFile.length;k++){
    				File f=new File(listeFile[k]);
    				if(f.isDirectory()){
    					nbDir++;
    					System.out.println("Rep: "+f.getName());
    					test= test || this.fileExist(path+"\\"+f.getName());
    				}else{
    					System.out.println("Fich: "+f.getName());
    					if((k==listeFile.length-1)){
    						//dernier fichier
    						if(nbDir==0){
    							//aucun sous rep
    							return false;
    						}
    					}
    				}
    			}
    		}
    		return test;
    	}
    J'ai sûrement oublié de un cas dans tout ça, mais là à chaud je vois pas.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		if(this.exists()){
    			return true;
    c'est censé faire quoi d'après toi ce genre de test? La méthode n'a aucun paramètre, elle ne peux donc pas se baser sur le fichier que tu viens d'analyser!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    					test= test || this.fileExist(path+"\\"+f.getName());
    tu pourrais utiliser f.getAbsolutePath() plutôt. En plus, ce serait mieux de revoir ta méthode pour qu'elle reçoive un File plutôt qu'un String


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    					if((k==listeFile.length-1)){
    						//dernier fichier
    						if(nbDir==0){
    							//aucun sous rep
    							return false;
    C'est quoi le but de ce code? A quoi te sert de compter les dossier?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    L'idée de compter les dossiers, c'était de détecter lorsque je me trouvais dans un dossier terminal ne contenant que des fichiers. Afin de faire mon return à ce moment là lorsque le dernier fichier est traité et pas avant.




    c'est censé faire quoi d'après toi ce genre de test? La méthode n'a aucun paramètre, elle ne peux donc pas se baser sur le fichier que tu viens d'analyser!
    Ben pour moi, en faisant f.exists() j'obtiens true si le fichier f existe dans le rep courant et false s'il n'existe pas. Du coup, j'avoue que je ne vois pas très bien ce qui pourrait clocher dans son utilisation...ça me semblait plus propre d'utiliser cette méthode plutôt que de faire un equals sur le nom du fichier.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. La question de @Tchize_ est pertinente parce que tu as écrit this.exists() pas f.exists().
    2. Pourquoi appeler list() qui retourne un String[] et convertir ces String en File, au lieu d'appeler listFiles() qui fait ça direct
    3. +1 pour la remarque sur le passage File vers String. En plus tu découpes le path en partie, et tu constitue le path en faisant de la concaténation avec "\\" ! A quoi ça sert, à part compliquer le code et prend du temps pour rien ?
    4. Sinon, list() n'est pas bogués : elle retourne bien la liste des fichiers qui sont dans le dossier (qui existent donc). Pourquoi vérifier s'ils existent ? Pour vérifier l'existence d'un ficher de chemin x, il suffit de faire if new File(x).exists() ).


    En revanche, si le but est de chercher si un nom de fichier existe dans une arborescence, ce qui pourrait être utile, l'algorithme ce serait plutôt :
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    existe(File dossier, String nom) {
       f = new File(dossier, nom);
       si f.exists() alors
           retourne vrai
       sinon
           pour tous les fichiers fichier dans dossier
               si fichier est un dossier et existe(fichier, nom) 
                  retourne vrai
               fin si
           fin pour
       fin si
       retourne faux
    }

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    En revanche, si le but est de chercher si un nom de fichier existe dans une arborescence, ce qui pourrait être utile, l'algorithme ce serait plutôt :
    C'est exactement ça.

    Ton algorithme me semble plus cohérent que le mien, je vais tester comme ça

    PS: Dans mon code, le this représentait bien un file puisque j'ai fais une classe étendant file.


    EDIT

    Voilà ce que ça donne en reprenant ton algo (ou du moins en essayant)

    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
     
    public boolean existe(File dir,String nom){
    		File f=new File(dir,nom);
    		if(f.exists()){
    			return true;
    		}else{
    			int k=0;
    			if(f.isDirectory()){
    				File[] liste=f.listFiles();
    				System.out.println(k);
    				for(k=0;k<liste.length;k++){
    					System.out.println(k);
    					if(liste[k].isDirectory()&& existe(liste[k],nom)){
    						return true;
    					}
    				}
    			}
    			return false;
    		}
    	}
    Malheureusement ça ne marche toujours pas.

    En gros, je teste la fonction et elle me renvoie false. Mais, ce qui est étonnant, c'est que la trace System.out.println(k) ne s'affiche jamais. Hors, ça me parait absurde de renvoyer faux sans jamais afficher une seule valeur de k...

    En fait, c'est comme si dès le premier appel de la fonction on ne rentrait pas dans le if et qu'on retournait directement faux.

    Peut être que le problème vient de mon appel dans le main ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyFile f= new MyFile("test.txt");
    File dos= new File(System.getProperty("user.dir")); //répertoire courant du programme
    System.out.println(f.existe(dos,f.getName())); //renvoie uniquement false

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par Amnael Voir le message
    PS: Dans mon code, le this représentait bien un file puisque j'ai fais une classe étendant file.
    oui mais pas celui que tu était occupé d'inspecter de toutes façons. Et oublie l'idée d'étendre File. Ta méthode utiliser des File, mais elle ne fait pas partie d'un File.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    Ton post s'est croisé avec mon édit du post précédent, navré

    Pour ce qui est de MyFile c'est juste un extend qui n'ajoute rien à File, je le renomme juste si on peut dire ça comme ça, donc je ne pense pas que ça pose de problème. C'est juste que je n'avais pas envie de mettre cette méthode dans une classe sans aucun rapport.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Amnael Voir le message
    [...]
    Malheureusement ça ne marche toujours pas.

    if(f.isDirectory()){ if ( dir.isDirectory() ) {
    File[] liste=f.listFiles(); File[] liste=dir.listFiles();

    Parce que c'est logique : c'est dans dir qu'on cherche.
    Parce que toute manière si c'était dans f, ça n'irait jamais dans ce code, puisque si f existe et c'est la première condition qui est vraie (f.exists()) donc ça return true et le else n'est pas exécuté. Et si f n'existe pas, il ne risque pas de contenir quoi que ce soit, et f.isDirectory() sera forcément faux.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Amnael Voir le message
    Pour ce qui est de MyFile c'est juste un extend qui n'ajoute rien à File, je le renomme juste si on peut dire ça comme ça, donc je ne pense pas que ça pose de problème. C'est juste que je n'avais pas envie de mettre cette méthode dans une classe sans aucun rapport.
    On te dit que ça ne change rien. C'est this n'a rien à voir à priori avec le paramètre path (sauf coïncidence particulière, ou le path de MyFile est le même ; à ne pas faire, des trucs qui fonctionnent ou pas selon des coïncidences). Les méthodes utilitaires de ce type, surtout quand elles sont indépendantes d'une instance, tu peux les mettre en static dans une classe dédiée, Utils, IOUtils, FileUtils...

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Points : 376
    Points
    376
    Par défaut
    C'est débogué merci beaucoup.

    Citation Envoyé par joel.drigo Voir le message
    On te dit que ça ne change rien. C'est this n'a rien à voir à priori avec le paramètre path (sauf coïncidence particulière, ou le path de MyFile est le même ; à ne pas faire, des trucs qui fonctionnent ou pas selon des coïncidences). Les méthodes utilitaires de ce type, surtout quand elles sont indépendantes d'une instance, tu peux les mettre en static dans une classe dédiée, Utils, IOUtils, FileUtils...

    Je suis totalement d'accord pour le static, mais c'est vrai que je n'y ai pas pensé du tout.

    Btw, merci à vous deux.

Discussions similaires

  1. parcourir arborescence fichiers
    Par Nayra dans le forum Langage
    Réponses: 1
    Dernier message: 20/11/2010, 13h13
  2. [débutant]Parcourir un fichier XML
    Par Wis dans le forum ASP
    Réponses: 2
    Dernier message: 26/09/2005, 10h04
  3. [Info]Parcours de l'arborescence fichier des postes clients
    Par klael dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 16/09/2005, 09h38
  4. Parcourir un fichier
    Par sepsep dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/07/2005, 08h25
  5. Réponses: 6
    Dernier message: 23/12/2003, 15h30

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