2011-08-23 15 views
38

que estoy escribiendo una línea de comandos sencilla utilidad de Java. Me gustaría que el usuario pueda pasar una ruta de archivo relativa a su directorio personal usando el operador ~. Así que algo como ~/Documents/...Cómo manejar ~ en las rutas de archivos

Mi pregunta es ¿hay una manera de hacer Java resolver este tipo de ruta de forma automática? ¿O necesito escanear la ruta del archivo para el operador ~?

Parece que este tipo de funcionalidad debe ser cocido en el objeto File. Pero no parece ser así.

+1

¿Qué sistema operativo (s) está destinado a su utilidad para? –

Respuesta

50

Un simple path = path.replaceFirst("^~",System.getProperty("user.home")); cuando se llega desde el usuario (antes de tomar una File a cabo de ello) debería ser suficiente para funcionar en la mayoría de los casos.

+5

La mayoría (todos?) Conchas sólo realizar la sustitución cuando el argumetn * comienza con * '~'. La ruta '/ a/~/c/d.txt' se interpretaría exactamente como la escribió bash, por ejemplo. –

+0

@andrzej bien, entonces la solución de petr es mejor, pero la mía es un poco más compacta –

+14

Solo ten en cuenta que esto realmente no funciona todo el tiempo. "~ otheruser/Documents" es también un directorio de inicio válido; pero no para "usuario.casa", para "usuario.casa" de otro usuario. Además, la tilde solo se expande a un directorio de inicio si es el primer carácter en una sección de directorio de una ruta. Aunque no es convencional, "a ~" es un archivo válido que no tiene nada que ver con los directorios principales. –

26

Esta es la expansión específicos del shell, por lo que necesita para reemplazarlo al principio de la línea, si está presente:

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

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

¿No debería ser 'System.getProperty ("user.home") + path.substring (2);' –

+0

sí, gracias, fijado –

8

Como Edwin Buck señaló en el comentario a la otra respuesta, ~/otheruser Los documentos también deben ampliar correctamente. He aquí una función que funcionó para mí:

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

ya que depende de ls, el método expandPath proporcionada por Dave M sólo funciona si existe la ruta de acceso. – sfosdal

+1

+1 Lanzar un nuevo proceso para esto parece una gran exageración, pero probablemente sea la única forma "correcta". – minexew

4

Una respuesta bastante optimizada que trabaja con caminos con real ~ personajes en ellos:

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

Tiene el mismo defecto que la respuesta de @ ratchet: '~ foo' será reemplazado por'/home/yournamefoo' en lugar de '/ home/foo'. – bfontaine

Cuestiones relacionadas