Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problema con path su Windows

    ciao!
    ho questa funzione qua per trovare il percorso del file jar che eseguo, senza contare il nome del file jar:
    codice:
        public String jarPath() throws UnsupportedEncodingException {
            String pathJar = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
            int p = pathJar.lastIndexOf(":");
            int s = pathJar.lastIndexOf(File.separator);
            String path = pathJar.substring(p + 1, s + 1);
            return path;
        }
    su linux nessun problema.
    su windows 7 ottengo invece questo errore:
    codice:
    java.lang.StringIndexOutOfBoundsException: String index out of range: -3
    supppongo sia un problema di percorsi dovuto al file separator.
    ma non saprei come sistemare.
    la variabile pathJar mi restituirebbe questa stringa:
    codice:
    /E:/Project/JAVA/JavaFilm/build/classes/
    non è un pò anomala per windows??

  2. #2
    certo che è anomalo....
    devi sistemarlo in base al tuo S.O.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    ok questo lo immaginavo.
    quello che mi suona strano è questo.
    con questa riga:
    codice:
    String pathJar = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
    io prendo il path dove si trova il jar in sostanza, giusto?
    non dovrebbe tirarmi su il percorso giusto da solo??

  4. #4
    ho fatto banalmente così:
    codice:
        public String jarPath() throws UnsupportedEncodingException {
            String pathJar = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
            if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) {
                pathJar = pathJar.replaceAll("/", "\\\\");
            }
            int p = pathJar.lastIndexOf(":");
            int s = pathJar.lastIndexOf(File.separator);
            String path = pathJar.substring(p + 1, s + 1);
            return path;
        }
    non so se sia la migliore soluzione, ma è l'unica cosa veloce che mi è venuta in mente.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Io non ho capito che cos'ha quel path che non ti piace.
    A me pare perfettamente plausibile.
    Tieni presente che il percorso che ottieni tu è in forma di URL (il metodo getLocation() di CodeSource restituisce un oggetto URL; il metodo getPath() di URL ritorna una stringa che rappresenta il percorso di quell'URL).

    Detto questo, non puoi di certo usare File.separator per cercare un separatore di file all'interno di un URL (funzionerebbe solo sui sistemi Unix-Like). Usa semplicemente lo slash.


    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. #6
    se uso lo slash al posto di File.separator non avrei lo stesso problema?
    il fatto è che su windows devo fare la conversione di / in \ sennò nn mi funziona.
    alla fine non è uguale??

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Originariamente inviato da fermat
    se uso lo slash al posto di File.separator non avrei lo stesso problema?
    No. Nelle URL si usa sempre e solo lo slash.
    Parlo di questa parte di codice

    codice:
    public String jarPath() throws UnsupportedEncodingException {
       String pathJar = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
       int p = pathJar.lastIndexOf(":");
       int s = pathJar.lastIndexOf(File.separator);
       String path = pathJar.substring(p + 1, s + 1);
       return path;
    }
    Nella stringa pathJar non avrai mai un backslash, ma File.separator, nei sistemi Windows, è proprio il backslash.

    il fatto è che su windows devo fare la conversione di / in \ sennò nn mi funziona.
    alla fine non è uguale??
    Perchè devi fare la conversione? I percorsi in Java andrebbero sempre scritti usando lo slash, indipendentemente dal sistema operativo che c'è sotto. Sarà la JVM a fare le dovute conversioni dove serve.

    Questo percorso
    codice:
    String path = "/Users/Pippo/"
    verrà correttamente accettato dalla JVM su qualunque sistema operativo. Se siamo in ambiente Unix-Like verrà lasciato così com'è, se siamo in ambiente Windows verrà convertito (implicitamente, senza alcun intervento da parte del programmatore) in

    codice:
    X:\Users\Pippo\
    dove X: sarà la lettera dell'unità disco corrente.

    Questo per quanto riguarda il trattamento dei file e dei percorsi... cosa diversa se si parla di "visualizzare" il percorso all'utente. In quest'ultimo caso sarà necessaria la conversione (ma è per comodità dell'utente, non certo per una specifica della JVM)

    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

  8. #8
    ok capito:
    codice:
        public String jarPath() throws UnsupportedEncodingException {
            String pathJar = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
            int p = pathJar.lastIndexOf(":");
            int s = pathJar.lastIndexOf("/");
            String path = pathJar.substring(p + 1, s + 1);
            return path;
        }
    così sembra funzionare anche sotto windows.
    grazie!

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.