Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16

Discussione: Path salvataggio file

  1. #11
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Devi togliere anche la parte iniziale, quel "file:"

    Ad ogni modo, giusto per mettere in chiaro le cose, quando si ha a che fare con i file con percorso "relativo", il percordo è appunto relativo alla current working directory (directory di lavoro corrente), che per il 90% dei casi è assolutamente dipendente dal sistema operativo.

    Quasi mai la directory corrente è la stessa del JAR. Ne è un esempio l'avvio con doppio clic dal desktop. Quando si è sul desktop, la directory corrente può essere il desktop stesso o, come nel tuo caso, la home directory dell'utente. Difficilmente sarà la directory del JAR.

    Per questo bisogna sempre prestare attenzione a come si costruiscono le applicazione che fanno uso dei file. O si imposta un batch di avvio che, come prima cosa, si posiziona nella directory del JAR (così si ha una certa sicurezza che la CurrentWorkingDirectory sia esattamente quella del JAR) oppure si ricorre a stratagemmi:

    1) Si recupera il PATH del JAR (come ha evidenziato Andrea1979 o come ho evidenziato in altri post io)

    2) Si adotta una directory fissa che l'applicazione userà (e che creerà se inesistente)

    3) Ci si appoggia ad una directory "nota" dal sistema operativo (tipo la home-directory dell'utente).

    Inoltre si deve seguire rigorosamente una regola: MAI usare delle stringhe fisse per il separatore di percorso (come quello slash nel indexOf() ). Appena si cambia piattaforma succedono i più assurdi disastri. Per queste cose esiste la costante File.separator che viene inizializzata dalla JVM in base alla piattaforma in cui si opera. C'è anche File.pathSeparator, che serve a capire qual è il separatore di percorsi (il punto e virgola su Windows, i due punti su Unix/Linux, ecc).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #12
    il discorso è questo: se usassi la home sarebbe più comodo e facile ma l'applicazione è portatile.
    sta dentro una pen drive quindi è inutile usare la home e poi a fine sessione copiare ogni volta il file.
    per questo all'inizio nn avevo usato nessun percorso.
    senza percorso solo linux da problemi.
    mac e windows funzionano perfettamente.
    a me serve di salvare il file nella stessa dierectory del jar.

    per quanto riguarda i separatori nn ti preoccupare, nel senso che per ora sto su linux.
    una volta che riesco a farlo funzionare sistemo il tutto facendo in modo che funzioni anche su windows.

    per quanto riguarda la questio path, adesso provo a togliere anche la parte file: e vedo che succede.
    grazie per le dritte intanto.

  3. #13
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Anch'io preferisco che i file dell'applicazione vengano salvati all'interno di una sottodirectory del percorso di installazione. Per questo uso il seguente codice per recuperare il path di installazione del JAR di avvio (dovrebbe essere equivalente a quanto postato da Andrea1979).

    Supponendo di usarlo all'interno di una classe Pippo che sta dentro al jar "MiaApp.jar":
    codice:
        private String getMyPath() {
            String str = Pippo.class.getResource("Pippo.class").toExternalForm();
    
            int start = 0;
            int end = str.indexOf("MiaApp.jar");   // Eventualmente preceduta dal nome della sottodirectory in cui c'è il JAR
            if ( str.startsWith("jar:") ) {
                start = 4;
            }
    
            if (str.indexOf("file:/") >= 0) {
                start += 6;
            }
            
            str = str.substring(start, end);
            str = str.replaceAll("%20", " ");
    
            return str;
        }
    Il commento "Eventualmente preceduta dal nome della sottodirectory in cui c'è il JAR" sta ad indicare che potrei avere (nel mio caso, solitamente è così) un file di louncer che avvia il jar all'interno di una sottodirectory "bin" della directory di installazione. In questo caso, uso "bin/MiaApp.jar", così mi evito un passaggio.

    Questo codice è testato e funzionante sui sistemi Windows, Linux e Mac.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #14
    grazie ottimo!
    io nel frattempo l'avevo pensata così:
    codice:
    public class OsPath {
    
        public static String osPath(String pathJar) {
            int p = pathJar.lastIndexOf(":");
            int s;
            if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) {
                s = pathJar.lastIndexOf("\\");
            } else {
                s = pathJar.lastIndexOf("/");
            }
            String path = pathJar.substring(p + 1, s + 1);
            return path;
        }
    }
    codice:
    public class Xml {
    
        private File xmlFile = null;
    
        public Xml() {
            String pathJar = this.getClass().getProtectionDomain().getCodeSource().getLocation().toString();
            xmlFile = new File(OsPath.osPath(pathJar) + "todo.xml");
        }
    ........
    su linux e mac funziona, su windows devo testare ancora.
    come soluzione com'è secondo te??

  5. #15
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non l'ho provato, ma il metodo osPath() può essere modificato (e migliorato) in questo modo:

    codice:
        public static String osPath(String pathJar) {
            int p = pathJar.lastIndexOf(":");
            int s = pathJar.lastIndexOf( File.separator );
            String path = pathJar.substring(p + 1, s + 1);
            return path;
        }
    Appena avrò un attimo ne testerò la bontà.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #16
    Originariamente inviato da LeleFT
    Non l'ho provato, ma il metodo osPath() può essere modificato (e migliorato) in questo modo:

    codice:
        public static String osPath(String pathJar) {
            int p = pathJar.lastIndexOf(":");
            int s = pathJar.lastIndexOf( File.separator );
            String path = pathJar.substring(p + 1, s + 1);
            return path;
        }
    Appena avrò un attimo ne testerò la bontà.


    Ciao.
    grazie per la dritta!!!!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.