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

<p>я создал отдельное java-приложение, в котором я пытаюсь изменить каталог с помощью команды "cd" в терминале ubuntu 10.04. я использовал следующий код.</p><pre><code>string[] command = new string[]{"cd",path}; process child = runtime.getruntime().exec(command, null); </code></pre><p>но приведенный выше код дает следующую ошибку </p><pre><code>exception in thread "main" java.io.ioexception: cannot run program "cd": java.io.ioexception: error=2, no such file or directory </code></pre><p>может кто-нибудь сказать, пожалуйста, как это реализовать? </p>

<p>не существует исполняемого файла с именем <code>cd</code>, потому что он <strong>не может</strong> быть реализован в отдельном процессе.</p><p>проблема в том, что у каждого процесса есть свой текущий рабочий каталог, а реализация <code>cd</code> как отдельного процесса будет только когда-либо менять <strong>что</strong> обрабатывает текущий рабочий каталог.</p><p>в java-программе вы <strong>не можете</strong> изменить свой текущий рабочий каталог, и вам это не нужно. просто используйте абсолютные пути к файлам.</p><p>единственный случай, когда текущий рабочий каталог имеет значение, - это выполнение внешнего процесса (с использованием <code>processbuilder</code> или <code>runtime.exec()</code>). в этих случаях вы можете явно указать рабочий каталог, который будет использоваться для вновь запущенного процесса ( <a href="http://download.oracle.com/javase/6/docs/api/java/lang/processbuilder.html#directory(java.io.file)"><code>processbuilder.directory()</code></a> и <a href="http://download.oracle.com/javase/6/docs/api/java/lang/runtime.html#exec(java.lang.string,%20java.lang.string%5b%5d,%20java.io.file)">трех аргумент <code>runtime.exec()</code></a> соответственно).</p><p>примечание: текущий рабочий каталог можно прочитать из <a href="http://download.oracle.com/javase/6/docs/api/java/lang/system.html#getproperties()">системного свойства</a> <code>user.dir</code>. вы можете почувствовать искушение <em>установить</em> это системное свойство. обратите внимание, что это приведет к <a href="https://stackoverflow.com/questions/2275362/java-file-exists-inconsistencies-when-setting-user-dir">очень серьезным несоответствиям</a> , потому что <a href="http://bugs.sun.com/bugdatabase/view\_bug.do?bug\_id=4117557">это не <em>означает</em> для записи</a> .</p>

<p>смотрите ссылку ниже (это объясняет, как это сделать):</p><p> <a href="http://alvinalexander.com/java/edu/pj/pj010016">http://alvinalexander.com/java/edu/pj/pj010016</a> </p><p>т.е.</p><pre><code>string[] cmd = { "/bin/sh", "-c", "cd /var; ls -l" }; process p = runtime.getruntime().exec(cmd); </code></pre>

<p>вы изучили эту команду exec для среды выполнения java, создайте объект файла с путем, по которому вы хотите "cd", а затем введите его в качестве третьего параметра для метода exec.</p><pre><code>public process exec(string command, string[] envp, file dir) throws ioexception </code></pre><p>выполняет указанную строковую команду в отдельном процессе с указанной средой и рабочим каталогом.</p><p>это удобный метод. вызов формы exec (команда, envp, dir) ведет себя точно так же, как и вызов exec (cmdarray, envp, dir), где cmdarray - это массив всех токенов в команде.</p><p>точнее, командная строка разбивается на токены с помощью stringtokenizer, созданного вызовом new stringtokenizer (команда) без дальнейшей модификации категорий символов. токены, созданные токенайзером, затем помещаются в новый строковый массив cmdarray в том же порядке.</p><pre><code>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 </code></pre>

<p>эта команда работает просто отлично</p><pre><code>runtime.getruntime().exec(sh -c 'cd /path/to/dir && progtoexecute) </code></pre>

<p>попробуйте использовать:</p><pre><code>runtime.getruntime.exec("cmd /c cd path"); </code></pre><p><strong> это сработало </strong></p><pre><code>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"); </code></pre><p><strong> ниже не сработало </strong> при использовании команды array не работает </p><pre><code>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); </code></pre><p>к вашему сведению, я использую утилиту для проверки ос, если ее окна выше будут работать не только для windows, удалите<strong> cmd </strong>и<strong>/c </strong></p>

<p>используя один из методов построителя процесса, мы можем передать каталог, в котором мы ожидаем, что cmd будет выполнен. пожалуйста, смотрите ниже пример. также вы можете указать время ожидания процесса, используя метод wait for.</p><pre><code>processbuilder builder = new processbuilder("cmd.exe", "/c", cmd).directory(new file(path)); process p = builder.start(); p.waitfor(timeoutsec, timeunit.seconds); </code></pre><p>в приведенном выше коде вы можете передать объект файла с путем [где мы ожидаем, что cmd будет выполнен] в метод каталога<strong> processbuilder </strong></p>

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