Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de gestion de tableaux imbriqués

Sujet résolu
    30 janvier 2009 à 2:53:35

    Bonjour !
    J'ai fait un programme pour enregistrer l'arborescence de mon disque dur, en passant par des tableaux, imbriqués dans le cas où un répertoire contient un autre répertoire (un tableau par répertoire en fait, et une case par fichier). Je vous copie/colle mon code, ça sera plus clair. Et donc le problème c'est que j'ai des NullPointerException et des ArrayOutOfBoundsException. Je sais ce que signifient ces erreurs, et je commente les lignes que je soupçonne de poser problème. Je cherche donc un moyen de passer outre ce problème, qui m'empêche de faire fonctionner convenablement mon programme.

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    
    
    public class Repertoire {
    	
    	public static int a=0;
    	
    	public static void main(String[] args) throws FileNotFoundException {
    		
    		String path = "C:\\";
    		PrintWriter pw = new PrintWriter("Liste.txt");
    		listerRepertoire(path, a, true, pw);
    		
    		
    	}
    	
    	public static void listerRepertoire(String nom_f, int a, boolean sauvegarde, PrintWriter rec) {
    		File f = new File(nom_f);
    		String[] s = f.list();                         // ici, "s" est écrasé en cas de nouveau répertoire
    		for(int i=0 ; i<s.length ; i++) {              // l'erreur précédente se répercute sur "s.length"
    			File f1 = new File(f+"\\"+s[i]);
    			if(f1.isDirectory()) {
    				a++;
    				if(sauvegarde) {
    					rec.println(tabulations(a-1)+" - "+f1.getName()+" (directory):");
    				}
    				System.out.println(tabulations(a-1)+" - "+f1.getName()+" (directory):");
    				listerRepertoire(f+"\\"+f1.getName(), a, sauvegarde, rec);
    				a--;
    			} else {
    				if(sauvegarde) {
    					rec.println(tabulations(a)+" - "+f1.getName());
    				}
    				System.out.println(tabulations(a)+" - "+f1.getName());
    			}
    		}
    	}
    	
    	public static String tabulations(int a) {
    		String s="";
    		for(int i=0 ; i<a ; i++) {
    			s += "\t";
    		}
    		return s;
    	}
    	
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      30 janvier 2009 à 11:21:26

      Normal je pense que avant de faire s.length tu devrait penser a verifier si tu est en face d'un fichier ou d'un repertoire.
      Si c'est bien un fichier , alors là pas la peine de faire le for.
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai tous les badges d'OpenClassrooms.
        1 février 2009 à 7:44:18

        Finalement j'ai réussi a contourner le problème... Comme j'avais des exceptions concernant l'indice de mon tableau, je parcours de 0 à Integer.MAX_VALUE et je stoppe quand une exception est levée, et ça fonctionne parfaitement.

        Je poste quand même mon code (que j'ai pas mal modifié depuis mon premier post), si ça peut aider quelqu'un.

        import java.io.*;
        
        
        public class Repertoire {
        	
        	static int a=0;
        	static int nbElements=0;
        	
        	public static void main(String[] args) throws FileNotFoundException {
        		
        		String path = "H:\\";
        		String enreg = "I:\\listingH.txt";
        		
        		System.out.println("Contenu du répertoire \""+path+"\" :");
        		PrintWriter rec = new PrintWriter(enreg);
        		try {
        			listerRepertoire(new File(path), a, true, rec);
        			rec.println("Nombre d'éléments : "+nbElements);
        			rec.close();
        			System.out.println("Le listing de "+path+" a été réalisé avec succès.");
        		} catch(Exception e) {
        			System.out.println("Le chemin spécifié n'existe pas.");
        		}
        		
        	}
        	
        	public static void listerRepertoire(File repertoire, int nTour, boolean enreg, PrintWriter repEnreg){
        		
        		try {
        			if(repertoire.isDirectory()) {
        				String [] listeFichiers = repertoire.list();
        				for(int i=0 ; i<Integer.MAX_VALUE ; i++) {
        					try {
        						File f = new File(repertoire+"\\"+listeFichiers[i]);
        						if(f.isDirectory()) {
        							a++;
        							if(enreg) {
        								repEnreg.println(nbTab(a-1)+"- "+listeFichiers[i]+" (directory) :");
        							}
        							System.out.println(nbTab(a-1)+"- "+listeFichiers[i]+" (directory) :");
        							listerRepertoire(f, a, enreg, repEnreg);
        							a--;
        						} else {
        							nbElements++;
        							if(enreg) {
        								repEnreg.println(nbTab(a)+"- "+listeFichiers[i]);
        							}
        							System.out.println(nbTab(a)+"- "+listeFichiers[i]);
        						}
        					} catch(Exception e) {
        						break;
        					}
        				} 
        				
        			} else {
        				System.out.println(nbTab(a)+"- "+repertoire.getName());
        			}
        		} catch(Exception e) {
        			repEnreg.close();
        			System.out.println("Une erreur est survenue durant le listing.");
        		}
        		
        	}
        	
        	public static String nbTab(int nb) {
        		String s="";
        		for(int i=0 ; i<nb ; i++) {
        			s += "\t";
        		}
        		return s;
        	}
        	
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          1 février 2009 à 11:01:42

          mhhh je ne sais pas si travailler avec des exeption est une bonne idée :/
          pour moi les exception surviennent uniquement quand il y'a un bug ou autre
          quelque choses d'anormal :o
          a mon avis l'utiliser pour arrêter une boucle c'est exagérément pompeux en ressources ....
          tu ferais mieux de comprendre pourquoi elle est levée =/ et stopper le tout avant ...
          • Partager sur Facebook
          • Partager sur Twitter

          Problème de gestion de tableaux imbriqués

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown