Come specificare il percorso di una cartella e di un file

di il
5 risposte

Come specificare il percorso di una cartella e di un file

Buongiorno a tutti, torno a scrivervi per un dubbio che mi perseguita. Ho realizzato un'applicazione che all'avvio deve leggermi da una directory "templates" i nomi di alcuni files .html ed inserirli in un jComboBox. Quando poi vado a selezionare un item del jComboBox dovrebbe leggermi il file selezionato ed incollarmi il template specifico in una jTextArea.

Ho notato che facendo così:
public void loadDirectory() {
        File directory;
        String[] files;
        
        directory = new File(name);
        files = null;
        
        try {
            files = directory.list();
        } catch(SecurityException ex) {
            JOptionPane.showMessageDialog(null, "Directory non trovata!", "Errore", JOptionPane.ERROR_MESSAGE);
        }
        
        for(String file : files) {
            if(file.endsWith(".html")) {
                list.addItem(file.substring(0, (file.length() - 5)));
            }
        }
        
    }
riesco a leggere i files dalla directory "templates" però si trova all'interno della cartella contenente il progetto. Per farvi capire meglio qui: http://puu.sh/ofmZu/edc197c95e.pn

Quando poi tento di leggere un template:
public String loadTemplate() {
        BufferedReader br;
    
        try {
            br = new BufferedReader(new FileReader(name));
            
            String line = "";
            while(line != null) {
                line = br.readLine();
                
                if(line != null) {
                    content += line + "\n";
                }
            }
            
        } catch (FileNotFoundException ex) {
            JOptionPane.showMessageDialog(null, "File non trovato!", "Errore", JOptionPane.ERROR_MESSAGE);
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Errore durante la lettura del file!", "Errore", JOptionPane.ERROR_MESSAGE);
        }
        
        return content;
    }
mi dà errore perché si aspetta che il file sia contenuto nella cartella Dist, praticamente dove viene generato il file .jar.

Come potrei risolvere questo problema?

Ps: aggiungo infine che dovrei distribuire l'applicazione ad altre persone. Ho letto che posso usare Excelsior Jet, quindi vorrei far in modo di trovare un modo grazie al quale se esiste una cartella "templates" all'interno della cartella di installazione, possa riuscire a leggere i files.

5 Risposte

  • Re: Come specificare il percorso di una cartella e di un file

    Kohei ha scritto:


    riesco a leggere i files dalla directory "templates" però si trova all'interno della cartella contenente il progetto.

    mi dà errore perché si aspetta che il file sia contenuto nella cartella Dist, praticamente dove viene generato il file .jar.
    Devi dimenticare "il progetto", la cartella "Dist" ecc... Quando la tua applicazione dovrà vivere e girare per conto suo, allora il progetto, i sorgenti, la dist non c'entreranno più nulla.

    In generale puoi aspettarti file/directory:
    - riferiti alla directory "corrente" (o sotto-directory) e quale che sia dipende da come/dove verrà avviata la applicazione.
    - riferiti a directory "notevoli" es. la "home" directory dell'utente (o sotto-directory)
    - indicati in input dall'utente (da linea di comando o da una GUI)

    Se invece quei file sono fissi e fanno parte della applicazione, allora dovresti trattarli come "risorse", incorporarli nella applicazione (che vuol dire alla fine che finiscono nel jar) e referenziarli secondo i getResource/getResourceAsStream di java.lang.Class.
  • Re: Come specificare il percorso di una cartella e di un file

    Io ho immaginato la directory "templates" come una directory che si aggiorna. Esempio l'utente scarica altri moduli e poi copia i files in "templates". Quando poi l'applicazione parte, carica tutto. Non so se sia la soluzione migliore, ma penso sia quella che si avvicina di più alle mie esigenze. Però non so come fare senza specificare il percorso completo del file.
  • Re: Come specificare il percorso di una cartella e di un file

    Kohei ha scritto:


    Però non so come fare senza specificare il percorso completo del file.
    Le soluzioni sono svariate, la directory dei "templates":
    a) la specifica l'utente come argomento alla applicazione.
    b) la gestisce l'utente tramite un qualche sistema di configurazione (es. file di properties).
    c) si presuppone che sia presente nella directory "corrente" (o sotto-directory).
    d) si presuppone che sia presente in una directory "nota" (o sotto-directory) es. la "home" dell'utente.
  • Re: Come specificare il percorso di una cartella e di un file

    c) si presuppone che sia presente nella directory "corrente" (o sotto-directory).
    Per fare ciò come devo specificare il percorso? Cioè che stringa passo all'argomento della funzione?

    Per come ho pensato io dovrebbe essere: templates
    Mentre per leggere un file specifico di quella cartella dovrebbe essere: templates\esempio.html

    Edit:
    a) Usare la current working directory, cioè sfruttare la proprietà di sistema "user.dir" il cui contenuto è chiaro e ben definito: la directory corrente. Chiaramente prima di lanciare la applicazione bisogna assicurarsi che la directory corrente sia quella in cui risiede il jar (e qui dipende da come viene lanciata la applicazione).

    b) Usare la "home" directory dell'utente, proprietà "user.home".

    c) Passare in input alla applicazione (sulla linea di comando) la directory.

    d) Usare un eventuale file di configurazione (che contiene la informazione sulla directory) magari posizionato in una locazione fissa/prestabilita o nella "home" directory o altro.
    Ho trovato una tua risposta ad un altro utente. Ecco io non ero a conoscenza del comando user.dir
  • Re: Come specificare il percorso di una cartella e di un file

    Kohei ha scritto:


    Ho trovato una tua risposta ad un altro utente. Ecco io non ero a conoscenza del comando user.dir
    Comunque dover prendere la system-property "user.dir" è raro, infatti se specifichi a qualunque classe di I/O un path "relativo", è già relativo alla directory corrente.
Devi accedere o registrarti per scrivere nel forum
5 risposte