Как использовать команду "cd" с использованием времени выполнения Java?
Я создал автономное приложение 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
Кто-нибудь может рассказать мне, как его реализовать?
Ответы
Ответ 1
Нет исполняемого файла с именем cd
, потому что он не может быть реализован в отдельном процессе.
Проблема состоит в том, что каждый процесс имеет свой текущий рабочий каталог и реализует cd
, поскольку отдельный процесс будет только изменять , который обрабатывает текущий рабочий каталог.
В программе Java вы не можете изменить текущий рабочий каталог, и вам не нужно. Просто используйте абсолютные пути к файлам.
В одном случае, когда текущая рабочая директория имеет значение, выполняется внешний процесс (используя ProcessBuilder
или Runtime.exec()
). В этих случаях вы можете явно указать рабочий каталог для нового процесса (ProcessBuilder.directory()
и три аргумента Runtime.exec()
соответственно.)
Примечание: текущий рабочий каталог можно прочитать из системного свойства user.dir
. Возможно, вы захотите установить это системное свойство. Обратите внимание, что это приведет к очень плохим несоответствиям, потому что он не должен быть доступен для записи.
Ответ 2
Вы изучили эту команду exec для java Runtime, создайте объект файла с контуром "cd" и затем введите его как третий параметр для метода exec.
public Process exec(String command,
String[] envp,
File dir)
throws IOException
Выполняет указанную командную строку в отдельном процессе с указанной средой и рабочим каталогом.
Это удобный метод. Вызов формы exec (command, 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
Ответ 3
См. ссылку ниже (это объясняет, как это сделать):
http://alvinalexander.com/java/edu/pj/pj010016
то есть.
String[] cmd = { "/bin/sh", "-c", "cd /var; ls -l" };
Process p = Runtime.getRuntime().exec(cmd);
Ответ 4
Эта команда работает просто отлично
Runtime.getRuntime().exec(sh -c 'cd /path/to/dir && ProgToExecute)
Ответ 5
Попробуйте использовать:
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);
FYI использует утилиту для проверки ОС, если ее окна выше будут работать иначе, чем windows, удалите cmd и /c
Ответ 6
Я решил это, предложив Java-приложению sh script, который был в том же каталоге, а затем в sh script сделал "cd".
Требовалось, чтобы я делал "cd" в определенном каталоге, чтобы целевое приложение могло работать правильно.