it-swarm.com.ru

Как использовать команду "cd", используя Java runtime?

Я создал отдельное Java-приложение, в котором я пытаюсь изменить каталог с помощью команды "cd" в терминале Ubuntu 10.04. Я использовал следующий код.

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

Но приведенный выше код дает следующую ошибку 

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

Может кто-нибудь сказать, пожалуйста, как это реализовать? 

47
Antrromet

Не существует исполняемого файла с именем cd, потому что он не может быть реализован в отдельном процессе.

Проблема в том, что у каждого процесса есть свой текущий рабочий каталог, а реализация cd как отдельного процесса будет только когда-либо менять что обрабатывает текущий рабочий каталог.

В Java-программе вы не можете изменить свой текущий рабочий каталог, и вам это не нужно. Просто используйте абсолютные пути к файлам.

Единственный случай, когда текущий рабочий каталог имеет значение, - это выполнение внешнего процесса (с использованием ProcessBuilder или Runtime.exec()). В этих случаях вы можете явно указать рабочий каталог, который будет использоваться для вновь запущенного процесса ( ProcessBuilder.directory() и трех аргумент Runtime.exec() соответственно).

Примечание: текущий рабочий каталог можно прочитать из системного свойстваuser.dir. Вы можете почувствовать искушение установить это системное свойство. Обратите внимание, что это приведет к очень серьезным несоответствиям , потому что это не означает для записи .

51
Joachim Sauer

Смотрите ссылку ниже (это объясняет, как это сделать):

http://alvinalexander.com/Java/edu/pj/pj010016

т.е.

String[] cmd = { "/bin/sh", "-c", "cd /var; ls -l" };
Process p = Runtime.getRuntime().exec(cmd);
15
user518066

Вы изучили эту команду exec для среды выполнения Java, создайте объект файла с путем, по которому вы хотите "cd", а затем введите его в качестве третьего параметра для метода exec.

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

Выполняет указанную строковую команду в отдельном процессе с указанной средой и рабочим каталогом.

Это удобный метод. Вызов формы exec (команда, envp, dir) ведет себя точно так же, как и вызов exec (cmdarray, envp, dir), где cmdarray - это массив всех токенов в команде.

Точнее, командная строка разбивается на токены с помощью StringTokenizer, созданного вызовом new StringTokenizer (команда) без дальнейшей модификации категорий символов. Токены, созданные токенайзером, затем помещаются в новый строковый массив cmdarray в том же порядке.

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
12
optimus0127

Эта команда работает просто отлично

Runtime.getRuntime().exec(sh -c 'cd /path/to/dir && ProgToExecute)
7
mateusz.zbikowski

Попробуйте использовать:

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

Это сработало

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"); 

Ниже не сработало При использовании команды array НЕ РАБОТАЕТ 

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);

К вашему сведению, я использую утилиту для проверки ОС, если ее окна выше будут работать не только для Windows, удалите cmd и/c

0
Dheeraj Sachan

Используя один из методов построителя процесса, мы можем передать каталог, в котором мы ожидаем, что cmd будет выполнен. Пожалуйста, смотрите ниже пример. Также вы можете указать время ожидания процесса, используя метод wait for.

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", cmd).directory(new File(path));

        Process p = builder.start();

        p.waitFor(timeoutSec, TimeUnit.SECONDS);

В приведенном выше коде вы можете передать объект файла с путем [где мы ожидаем, что cmd будет выполнен] в метод каталога ProcessBuilder

0
TechDog

Я решил эту проблему с помощью приложения Java, выполняющего сценарий sh, который находился в том же каталоге, а затем в сценарии sh выполнял «cd».

Требовалось, чтобы я сделал «cd» для определенного каталога, чтобы целевое приложение могло работать должным образом.

0
Rami Del Toro