2009-06-22 8 views
16

Esiste comunque in Java per scoprire se il percorso specificato è assoluto o meno indipendentemente dalla piattaforma attualmente in esecuzione. Quindi, quello che voglio è probabilmente qualcosa di simile al seguente esempio:Java: Come scoprire se il percorso è assoluto indipendentemente dal sistema operativo

Su Linux:

new File("/home/").isAbsolute() // Should return true. 
new File("C:/My Documents").isAbsolute() // Should *also* return true. 

Su Windows:

new File("C:/Documents").isAbsolute() // Should return true. 
new File("/home/").isAbsolute() // Should *also* return true. 

posso probabilmente qualcosa di codice per aggirare questo, ma io volevo solo scoprire se qualcuno conosceva una classe built-in fornita in Java per risolvere questo problema. O qualcuno ha mai avuto questo problema? E come l'hai risolto?

Grazie!

+1

su linux, un percorso di tipo "C:/Documenti" è probabilmente valido, e non è certamente assoluta. Nei sistemi che implementano lo standard posix, tutti i percorsi esistono al di sotto di una singola 'radice', e quindi un percorso assoluto inizia da quella radice. Quindi un percorso assoluto inizia sempre con "/". qualsiasi altra cosa è considerata relativa alla directory di lavoro corrente del processo. Su Linux, "C:/..." è inteso come la directory all'interno della directory di lavoro corrente che si chiama "C:" che è probabilmente una sciocchezza. – SingleNegationElimination

+1

La tua domanda ha poco senso. Immagina un ipotetico sistema operativo in cui tutti i percorsi sono assoluti. Diciamo che c'è java su questo sistema operativo. Quindi, per soddisfare le tue esigenze, hai bisogno di un metodo isFileAbsolute() che restituisce sempre true, indipendentemente dalla piattaforma in cui è in esecuzione il programma. Facile da implementare, ma privo di significato. –

+0

Ho una situazione in cui l'utente configura una directory di lavoro su un computer remoto. Il computer remoto potrebbe utilizzare Unix o Windows (sebbene lo scenario più comune sia la macchina locale è Windows e la macchina remota è unix). Il percorso specificato dall'utente deve essere convalidato ed è necessario per determinare se un percorso è assoluto. –

risposta

10

No.

Ci sono alcuni sottostanti FileSystem classi (che è Java 7, ma esistono prima di esso pure) che espongono isAbsolute(), ma sono senza pubblico - in modo da non dovrebbero usarli, e anche se hai fatto il tuo codice sarebbe pieno di spazzatura di riflessione - e solo i "corretti" OS sono inclusi nel JRE, quindi dovresti codificarli comunque.

Ecco le implementazioni di Java 7 di isAbsolute (...) per iniziare. Nota che File.getPrefixLength() è pacchetto-privato.

Win32FileSystem:

public boolean isAbsolute(File f) 
{ 
     int pl = f.getPrefixLength(); 
     return (((pl == 2) && (f.getPath().charAt(0) == slash)) 
       || (pl == 3)); 
} 

UnixFileSystem:

public boolean isAbsolute(File f) 
{ 
     return (f.getPrefixLength() != 0); 
} 
+9

Nota che dopo sei anni questa risposta è obsoleta. Oggigiorno, la classe File contiene un metodo "[isAbsolute()] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#isAbsolute)" che fa esattamente quello che tu d: "Verifica se questo percorso astratto è assoluto La definizione di percorso assoluto dipende dal sistema .. Sui sistemi UNIX, un percorso è assoluto se il suo prefisso è"/". Sui sistemi Microsoft Windows, un percorso è assoluto se è il suo prefisso è un identificatore di unità seguito da "\\", o se il suo prefisso è "\\\\" _ – Guus

-1

ho finito per usare questo (in Java 6):

private static boolean testPath(String path) { 
    int prefixLen = FilenameUtils.getPrefixLength(path); 
    if (testPathWin(path, prefixLen) || testPathLinux(prefixLen)) 
     return true; 
    else 
     return false; 
} 

private static boolean testPathWin(String path, int prefixLen) { 
    if (prefixLen == 3) 
     return true; 
    File f = new File(path); 
    if ((prefixLen == 2) && (f.getPath().charAt(0) == '/')) 
     return true; 
    return false; 
} 

private static boolean testPathLinux(int prefixLen) { 
    return (prefixLen != 0); 
} 
+0

È stata copiata l'implementazione Java 7 pubblica booleana isAbsolute (File f) per Windows ma si utilizza il metodo apache commons FilenameUtils.getPrefixLength() L'implementazione di Java 7 e l'implementazione Apache di getPrefixLength() non sono la stessa cosa: per i percorsi UNC apache restituirà "\\ foo \ poo" -> "\\ foo \" come prefisso e la lunghezza sarà 6 – acheron55

+0

@ Acheron55: I don capisco che "isAbsolute()" a cui fai riferimento? Dove si trova esattamente nel mio frammento di codice sorgente? – stuhpa

+0

check t Il codice sorgente di FilenameUtils.getPrefixLength (percorso). Può restituire qualsiasi numero di lunghezza per i percorsi UNC. Ma controlli solo la lunghezza 2 o 3 nel tuo metodo testPathWin. Quindi è sbagliato. Sarebbe vero se potessi usare l'implementazione java di esso. Perché restituisce solo valori 0,1,2,3. Anche questa riga: 'if (testPathWin (percorso, prefissoLen) || testPathLinux (prefixLen))' controllo di linux renderà il metodo Windows inutile poiché ha un intervallo molto più ampio. Supponiamo che la lunghezza sia 1 per un percorso Windows, ma il metodo testPath restituirà true, che è falso – acheron55

3

mio crepa a questo usando Apache FilenameUtil -

public static boolean isAbsolute(final String path) { 
     return FilenameUtils.getPrefixLength(path) != 0; 
    } 

Tecnicamente questo sta tornando! Relativo. Che va bene per i miei scopi.

8

In Java 7:

new File(path).isAbsolute()