Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    Porblema con return e jTextArea

    ho questo metodo per scansionare directory:
    codice:
    public class ListDir {
    
        static public void main(String args[]) throws Exception {
            scansionaDirectory(new File("E:\\a"));
        }
    
        public static String scansionaDirectory(File dir) throws IOException {
            String result = "";
            File[] elementi = dir.listFiles();
            File file = null;
            if (elementi == null) {
                throw new IOException("Errore lista entry per " + dir);
            }
            for (int i = 0; i < elementi.length; i++) {
                file = elementi[i];
                if (file.isDirectory()) {
                    scansionaDirectory(file);
                }
                result += file;
                System.out.println(file);
            }
            return result;
        }
    }
    in un frame ho creato questo evento:
    codice:
        private void formWindowOpened(java.awt.event.WindowEvent evt) {
            try {
                jTextArea1.setText(ListDir.scansionaDirectory(new File("E:\\a")));
            } catch (IOException ex) {
                System.out.print(ex.getMessage());
            }
        }
    il Sytem.out mi restituisce la lista giusta, mentre la stampa nella jTextAre mi restituisce solo alcuni file/directory.
    sapete dirmi il motivo?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Porblema con return e jTextArea

    Originariamente inviato da fermat
    il Sytem.out mi restituisce la lista giusta, mentre la stampa nella jTextAre mi restituisce solo alcuni file/directory.
    sapete dirmi il motivo?
    A parte il fatto che nella concatenazione a result non vedo l'aggiunta di newline (o qualche separatore) .... quindi avresti tutti i file appiccicati uno dietro l'altro. Ma comunque il punto è un altro. Quando invochi il metodo ricorsivamente non usi la stringa restituita.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    giusto, ho modificato così:
    codice:
        
    public static String scansionaDirectory(File dir) throws IOException {
            String result = "";
            File[] elementi = dir.listFiles();
            File file = null;
            if (elementi == null) {
                throw new IOException("Errore lista entry per " + dir);
            }
            for (int i = 0; i < elementi.length; i++) {
                file = elementi[i];
                if (file.isDirectory()) {
                    scansionaDirectory(file);
    //                System.out.println(file);
                    result += file + "\n";
                } else {
                    result += file + "\n";
    //                System.out.println(file);
                }
            }
            return result;
        }
    ma ancora nn è completo.
    mancano i file della seconda directory.
    anche se cmq nn capisco perchè ci sono risultati diversi.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    giusto, ho modificato così:
    codice:
                    if (file.isDirectory()) {
                        scansionaDirectory(file);
    ma ancora nn è completo.
    Ripeto che non stai usando quello che scansionaDirectory può restituirti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ho pensato potesse essere un problema di cicli for e ho modificato così:
    codice:
        public static String scansionaDirectory(File dir) throws IOException {
            String result = "";
            File[] elementi = dir.listFiles();
            File file = null;
            if (elementi == null) {
                throw new IOException("Errore lista entry per " + dir);
            }
            for (int i = 0; i < elementi.length; i++) {
                file = elementi[i];
                if (file.isDirectory()) {
                    scansionaDirectory(file);
                    for (int j = 0; j < elementi.length; j++) {
                        result += file + "\n";
                    }
                } else {
                    result += file + "\n";
                }
            }
            return result;
        }
    ma mi da lo stesso risultato.
    c'è qualcosa che sicuramente nn so e che nn riesco a capire.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    codice:
                if (file.isDirectory()) {
                    scansionaDirectory(file);
    ma mi da lo stesso risultato.
    c'è qualcosa che sicuramente nn so e che nn riesco a capire.
    Ogni invocazione di scansionaDirectory tratta le entry della sola directory passata come argomento. Se una entry è una directory si va però in "ricorsione". La invocazione "innestata" (chiamiamola così) si occupa di quella entry-directory che a sua volta può contenere altre directory, quindi altre invocazioni ricorsive, ecc...

    In sostanza ogni invocazione ricorsiva tratta un "sotto-albero" del file-system e al livello di ricorsione superiore dovresti prendere ciò che il scansionaDirectory innestato ti restituisce e aggiungerlo al tuo elenco.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    codice:
        public static String scansionaDirectory(File dir) throws IOException {
            String result = "";
            File[] elementi = dir.listFiles();
            File file = null;
            if (elementi == null) {
                throw new IOException("Errore lista entry per " + dir);
            }
            for (int i = 0; i < elementi.length; i++) {
                file = elementi[i];
                if (file.isDirectory()) {
                    scansionaDirectory(file);
                    elementi = file.listFiles();
                    for (int j = 0; j < elementi.length; j++) {
                        file = elementi[j];
                        result += file + "\n";
                    }
                } else {
                    result += dir + "\n" + file + "\n";
                }
            }
            return result;
        }
    così funziona con un piccolo problema: io vorrei stampare anche solo le directory.
    il risultato però è questo:
    codice:
    E:\a E:\a\a1 E:\a E:\a\a2 E:\a\b\b1
    stampa due volte la directory E:\a e nn stampa E:\b.
    nn so se è perchè mi manca qualcosa o perchè nn è scritto bene il codice in generale.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    io vorrei stampare anche solo le directory.
    Ma io ora non so più come dirlo ....

    Se la struttura fosse per es.:

    codice:
    E:\a
        uno.txt
        due.txt
        mydir
            tre.txt
            quattro.txt
    La prima invocazione di scansionaDirectory contribuisce a trovare e a mettere insieme "uno.txt", "due.txt" e "mydir" (la directory potresti volerla mettere o no nell'elenco).

    Ma è la invocazione "innestata" di scansionaDirectory che contribuisce a trovare "tre.txt" e "quattro.txt" e cosa fa? Crea una stringa che contiene solo queste entry e la restituisce.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    ma io questo lo so ancor prima di venire a rompere qua.
    è questo pezzo che mi manca.
    codice:
    Crea una stringa che contiene solo queste entry e la restituisce.
    a livello teorico lo so come si fa, e a livello pratico che mi manca.

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    a livello teorico lo so come si fa, e a livello pratico che mi manca.
    Ma scusa, le concatenazioni sai farle .... le vedo nel codice. Quale è il dubbio o problema nel capire che se una invocazione di scansionaDirectory al livello X+1 ti fornisce la stringa relativa ad un sotto-ramo devi concatenarla con quello che viene trovato nella invocazione di scansionaDirectory al livello X??

    Prendiamo l'esempio di prima: la invocazione ricorsiva di scansionaDirectory trova e concatena "tre.txt\nquattro.txt\n" e lo restituisce. Al livello più sopra, è stato trovato "uno.txt\ndue.txt\n" e cosa manca? Che ci concateni cosa è stato trovato più innestato!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.