2011-08-23 15 views
38

Sto scrivendo una semplice utility Java da riga di comando. Vorrei che l'utente fosse in grado di passare un percorso file relativo alla propria directory home usando l'operatore ~. Quindi qualcosa come ~/Documents/...Come gestire ~ nei percorsi file

La mia domanda è c'è un modo per rendere Java risolvere questo tipo di percorso automaticamente? O devo scannerizzare il percorso del file per l'operatore ~?

Sembra che questo tipo di funzionalità debba essere inserito nell'oggetto File. Ma non sembra essere.

+1

Quale sistema operativo (s) è il vostro programma di utilità destinato? –

risposta

50

Un semplice path = path.replaceFirst("^~",System.getProperty("user.home")); quando viene ottenuto da parte dell'utente (prima di effettuare un File fuori di esso) dovrebbe essere sufficiente per funzionare nella maggior parte dei casi.

+5

La maggior parte delle shell (tutte?) Eseguirà la sostituzione solo quando argumetn * inizia con * '~'. Il percorso '/ a/~/c/d.txt' sarebbe interpretato esattamente come scritto da bash, per esempio. –

+0

@andrzej beh, allora la soluzione di Petr è migliore, ma la mia è un po 'più compatta –

+14

Basta stare attenti che questo non funzioni tutto il tempo. "~ otheruser/Documents" è anche una home directory valida; ma, non per "user.home", per "user.home" di un altro utente. Inoltre, la tilde viene espansa solo in una directory home se è il primo carattere in una sezione di directory di un percorso. Sebbene non convenzionale, "a ~" è un file valido che non ha nulla a che fare con le home directory. –

26

Questo è l'espansione specifico-shell, quindi è necessario sostituirla all'inizio della linea, se presente:

String path = "~/xyz"; 
... 
if (path.startsWith("~" + File.separator)) { 
    path = System.getProperty("user.home") + path.substring(1); 
} 

File f = new File(path); 
... 
+4

non dovrebbe essere 'System.getProperty (" user.home ") + path.substring (2);' –

+0

sì, grazie, risolto –

8

Come indicato da Edwin Buck nel commento a un'altra risposta, ~ altri utenti/documenti dovrebbero espandersi correttamente. Ecco una funzione che ha funzionato per me:

public String expandPath(String path) { 
    try { 
     String command = "ls -d " + path; 
     Process shellExec = Runtime.getRuntime().exec(
      new String[]{"bash", "-c", command}); 

     BufferedReader reader = new BufferedReader(
      new InputStreamReader(shellExec.getInputStream())); 
     String expandedPath = reader.readLine(); 

     // Only return a new value if expansion worked. 
     // We're reading from stdin. If there was a problem, it was written 
     // to stderr and our result will be null. 
     if (expandedPath != null) { 
      path = expandedPath; 
     } 
    } catch (java.io.IOException ex) { 
     // Just consider it unexpandable and return original path. 
    } 

    return path; 
} 
+1

Poiché dipende da ls, il metodo expandPath fornito da Dave M funziona solo se il percorso esiste. – sfosdal

+1

+1 Avviare un nuovo processo per questo sembra un enorme overkill, ma probabilmente è l'unico modo "corretto". – minexew

4

Una risposta abbastanza snella che funziona con percorsi con effettiva ~ caratteri in loro:

String path = "~/Documents"; 
path.replaceFirst("^~", System.getProperty("user.home")); 
+0

Questo ha lo stesso difetto della risposta di @ ratchet: '~ foo' sarà sostituito da'/home/yournamefoo' invece di '/ home/foo'. – bfontaine

Problemi correlati