2011-02-03 20 views
42

He creado una aplicación java independiente en la que estoy tratando de cambiar el directorio usando el comando "cd" en la terminal Ubuntu 10.04. He usado el siguiente código.¿Cómo se usa el comando "cd" usando Java runtime?

String[] command = new String[]{"cd",path}; 
Process child = Runtime.getRuntime().exec(command, null); 

Pero el código anterior muestra el siguiente error

Exception in thread "main" java.io.IOException: Cannot run program "cd": java.io.IOException: error=2, No such file or directory 

Puede alguien por favor dígame cómo implementarlo?

+0

Un escape fue para iniciar un nuevo shell y disparar todos sus comandos su - http://www.webmasterworld.com/linux/3613813.htm – letsc

Respuesta

47

No hay ningún ejecutable llamado cd, porque no se puede implementar en un proceso separado.

El problema es que cada proceso tiene su propio directorio de trabajo actual y la implementación de cd como un proceso separado sería sólo alguna vez cambiar que procesos directorio de trabajo actual.

En un programa Java usted no puede cambiar su directorio de trabajo actual y no debería necesitarlo. Simplemente use rutas absolutas de archivos.

El único caso en el que el directorio de trabajo actual es importante está ejecutando un proceso externo (usando ProcessBuilder o Runtime.exec()). En esos casos, puede especificar explícitamente el directorio de trabajo que se utilizará para el proceso recién iniciado (ProcessBuilder.directory() y three-argument Runtime.exec()).

Nota: el directorio de trabajo actual se puede leer en system propertyuser.dir. Puede sentirse tentado de establecer esa propiedad del sistema. Tenga en cuenta que hacerlo conducirá a very bad inconsistencies, porque it's not meant to be writable.

+0

Estoy usando runtime.exec(). ¿Me puede decir cómo especificar explícitamente el directorio de trabajo? – Antrromet

+1

@Antro http://stackoverflow.com/questions/544519/change-directory-and-run-the-batch-file-in-the-same-command-prompt –

+0

@Jigar Ya vi esa pregunta antes. Pero la solución usa Executer pero solo quiero usar Runtime. – Antrromet

12

¿Ha explorado este comando de ejecución para un entorno de ejecución Java, cree un objeto de archivo con la ruta a la que desea "cd" y luego ingrese como un tercer parámetro para el método exec.

public Process exec(String command, 
       String[] envp, 
       File dir) 
     throws IOException 

Ejecuta el comando de cadena especificado en un proceso separado con el entorno y el directorio de trabajo especificados.

Este es un método de conveniencia. Una invocación del formulario exec (comando, envp, dir) se comporta exactamente de la misma manera que el ejecutable de invocación (cmdarray, envp, dir), donde cmdarray es una matriz de todos los tokens bajo comando.

Más precisamente, la cadena de comandos se divide en tokens usando un StringTokenizer creado por la llamada nueva StringTokenizer (comando) sin modificaciones adicionales de las categorías de caracteres. Los tokens producidos por el tokenizer se colocan en la nueva matriz de matriz cmdarray, en el mismo orden.

Parameters: 
    command - a specified system command. 
    envp - array of strings, each element of which has environment variable settings in the format name=value, or null if the subprocess should inherit the environment of the current process. 
    dir - the working directory of the subprocess, or null if the subprocess should inherit the working directory of the current process. 
Returns: 
    A new Process object for managing the subprocess 
Throws: 
    SecurityException - If a security manager exists and its checkExec method doesn't allow creation of the subprocess 
    IOException - If an I/O error occurs 
    NullPointerException - If command is null, or one of the elements of envp is null 
    IllegalArgumentException - If command is empty 
+0

Esto debería ser la respuesta que creo que –

6

Este comando funciona bien

Runtime.getRuntime().exec(sh -c 'cd /path/to/dir && ProgToExecute) 
+0

no sigo no debería ser 'Runtime.getRuntime(). Exec (" sh -c 'cd/path/to/dir && ProgToExecute' ")'? Esto devuelve el código de salida '2' – lisak

0

Probar Usar:

Runtime.getRuntime.exec("cmd /c cd path"); 

Esto funcionó

Runtime r = Runtime.getRuntime(); 
r.exec("cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf"); 

La continuación no funcionó Durante el uso de comandos serie no funcionaba

String[] cmd = {"cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf"}; r.exec(cmd); 

FYI estoy usando utilidad para comprobar OS si sus ventanas por encima van a trabajar para que no sea Windows eliminar cmd y /c

0

Lo resolví haciendo que la aplicación Java ejecutara un script sh que estaba en el mismo directorio y luego en el script sh había hecho el "cd".

Se requiere que haga un "cd" a un directorio específico para que la aplicación de destino pueda funcionar correctamente.

Cuestiones relacionadas