Problema con scannerizzazione cartelle

di il
9 risposte

Problema con scannerizzazione cartelle

Salve a tutti, non essendo ancora molto bravo con java, ogni tanto mi cimento con qualche programma per scoprire nuove classi e nuovi costrutti e a questo scopo ho iniziato un programma che scannerizza una cartella scelta dall'utente e stampa a schermo una lista di file con una estensione scelta appunto dall'utente. Provando con il debug di eclipse ho visto che tutto funziona bene, ma arrivato nell' if posto nel ciclo lo salta, anche se la condizione risulta vera e non so dove sia l'errore
	public static void scan(){
		File f = new File(percorso);
		int num = f.listFiles().length;
		String[] nome = new String[num];
		nome = f.list();
		int c =1;
		for(int i=0; i < num; i++){
			String nome1= nome[i];
			est1 = nome1.substring(nome1.lastIndexOf("."));
			if (est == est1){
				c= c+1;
				System.out.println("["+c+"] " + nome1);
			}
		}
	}
Spero che qualcuno riesca ad aiutarmi

9 Risposte

  • Re: Problema con scannerizzazione cartelle

    simone97 ha scritto:


    ma arrivato nell' if posto nel ciclo lo salta, anche se la condizione risulta vera e non so dove sia l'errore
    Innanzitutto non è una buona cosa (e nemmeno molto sensato) usare listFiles() solo per avere la lunghezza e poi usare un ulteriore list() per ottenere la lista. Usa uno solo dei due.
    Inoltre lastIndexOf può ritornare -1 per indicare "non trovato". Ma -1 usato come indice in substring non è valido (=IndexOutOfBoundsException).
    E anche se avessi fatto tutto giusto per ottenere l'estensione, il contenuto delle stringhe (degli oggetti in generale) non si compara con == ma con equals.
    E infine se volessimo fare i pignoli, se vuoi solo i file, dovresti scartare a priori le directory (tipicamente le directory non hanno nomi con una estensione .... ma tecnicamente è possibile).

    Insomma, così come l'hai fatto non ci siamo.
  • Re: Problema con scannerizzazione cartelle

    Da quanto ho capito devo quindi mettere un try-catch al "lastOfIndex()", cambiare == con equals e utilizzare ad esempio solamente list() per avere il numero di files nella directory?

    Inviato dal mio HTC Desire C utilizzando Tapatalk
  • Re: Problema con scannerizzazione cartelle

    simone97 ha scritto:


    Da quanto ho capito devo quindi mettere un try-catch al "lastOfIndex()"
    Non è da risolvere con un try-catch (nel senso che non è l'approccio corretto). Devi fare almeno 1 if.

    simone97 ha scritto:


    cambiare == con equals

    simone97 ha scritto:


    utilizzare ad esempio solamente list() per avere il numero di files nella directory?
    Sì, per avere il numero e allo stesso tempo anche i nomi.
  • Re: Problema con scannerizzazione cartelle

    Grazie mille dell'aiuto!

    Inviato dal mio HTC Desire C utilizzando Tapatalk
  • Re: Problema con scannerizzazione cartelle

    Ora funziona (quasi) bene... Non capisco il perché ma stampa a schermo tutte le stringhe due volte (per esempio se deve stampare [1] e [2] stampa [1][2][1][2])... Qualche aiuto?
  • Re: Problema con scannerizzazione cartelle

    simone97 ha scritto:


    Ora funziona (quasi) bene... Non capisco il perché ma stampa a schermo tutte le stringhe due volte (per esempio se deve stampare [1] e [2] stampa [1][2][1][2])... Qualche aiuto?
    Mostra il codice.
  • Re: Problema con scannerizzazione cartelle

    Ecco qua tutto quanto il codice, ho provato a riadattarlo secondo i tuoi consigli, ma (probabilmente) senza riuscirci...
    package ricerca;
    import java.util.*;
    import java.io.*;
    
    public class Ricerca {
    	static Scanner leggi = new Scanner(System.in);
    	static File dir;
    	static File[] list;
    	public static String percorso, est, est1;
    	public static void main(String[] args){
    		percorso();
    		scan();
    	}
    	public static void percorso(){
    		System.out.println("Inserisci il percorso della directory");
    		percorso = leggi.nextLine();
    		if(percorso.equals("exit")){
    			System.exit(0);
    		}else{
    				File f = new File(percorso);
    			boolean esiste = f.isDirectory();
    			if(esiste == true){
    				System.out.println("Immetti il tipo di file da cercare");
    			try{
    				est = "." + leggi.nextLine();
    			}catch(InputMismatchException e){
    				System.out.println("Si è verificato un errore: " + e);
    			}
    			scan();
    			}else{
    				if(f.isFile() == true){
    					System.out.println("Hai messo il percorso di un file.");
    					System.out.println("");
    					percorso();
    				} else if(f.isFile() == false){
    					System.out.println("Hai messo un percorso sbagliato. Ricontrollalo.");
    					System.out.println("");
    					percorso();
    				}
    			}
    		}
    	}
    	
    
    	public static void scan(){
    		File f = new File(percorso);
    		int num = f.list().length;
    		String[] nome = new String[num];
    		nome = f.list();
    		int c =0;
    		for(int i=0; i < num; i++){
    			String nome1= nome[i];
    			try{
    				est1 = nome1.substring(nome1.lastIndexOf("."));
    			}catch(Exception e){
    				System.out.println("Si è verificato un errore: " + e);
    			}
    			if (est.equals(est1)){
    				c= c+1;
    				System.out.println("["+c+"] " + nome1);
    			}
    		}
    	}
    }
    Comunque mi è già successo qualche volta che alcuni programmi che ho scritto stampassero o facessero qualcosa una volta di troppo, ma non sono mai riuscito a risolvere...
  • Re: Problema con scannerizzazione cartelle

    simone97 ha scritto:


    		int num = f.list().length;
    		String[] nome = new String[num];
    		nome = f.list();
    1)
    String[] nomi = f.list();
    int num = nomi.length;
    Non ti sembra meglio?
    (il tuo new String[num] è inutile e il list() lo invochi ancora 2 volte)

    simone97 ha scritto:


    			try{
    				est1 = nome1.substring(nome1.lastIndexOf("."));
    			}catch(Exception e){
    				System.out.println("Si è verificato un errore: " + e);
    			}
    2) Ti ho già detto prima che la "buona" soluzione non è il try-catch ma il test del valore restituito da lastIndexOf. È diverso da -1? Prendi la estensione. È uguale a -1? Ignora il file (o consideralo con estensione "", vuota, se è una opzione che vuoi poter gestire).

    3) Ma il problema dei "doppioni" è che scan() lo invochi sia dal main() che dal percorso().

    (ancora uno)
    4) Il fatto di avere tutti metodi statici e di "passare" i valori tra i metodi usando campi statici non è un "buon" design. Su questo aspetto concettuale dovresti "lavorarci" un pochino.
  • Re: Problema con scannerizzazione cartelle

    Finalmente il programma funziona bene e stampa a schermo quello che effettivamente ho richiesto, volendo anche le cartelle presenti nella directory principale
    Grazie!

    Inviato dal mio HTC Desire C utilizzando Tapatalk
Devi accedere o registrarti per scrivere nel forum
9 risposte