wake-up-neo.net

Wie verwende ich den Befehl "cd" bei der Java-Laufzeit?

Ich habe eine eigenständige Java-Anwendung erstellt, in der ich versuche, das Verzeichnis mithilfe des Befehls "cd" in Ubuntu 10.04 zu ändern. Ich habe den folgenden Code verwendet.

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

Der obige Code gibt jedoch den folgenden Fehler aus 

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

Kann mir bitte jemand sagen, wie ich es umsetzen soll? 

47
Antrromet

Es gibt keine ausführbare Datei mit dem Namen cd, da sie nicht in einem separaten Prozess implementiert werden kann .

Das Problem ist, dass jeder Prozess sein eigenes aktuelles Arbeitsverzeichnis hat und die Implementierung von cd als separaten Prozess immer nur das ändert, das das aktuelle Arbeitsverzeichnis verarbeitet .

In einem Java Programm können Sie Ihr aktuelles Arbeitsverzeichnis nicht ändern und sollten dies auch nicht müssen. Verwenden Sie einfach absolute Dateipfade.

Der eine Fall, in dem das aktuelle Arbeitsverzeichnis von Bedeutung ist, ist die Ausführung eines externen Prozesses (unter Verwendung von ProcessBuilder oder Runtime.exec()). In diesen Fällen können Sie das für den neu gestarteten Prozess zu verwendende Arbeitsverzeichnis explizit angeben ( ProcessBuilder.directory() bzw. drei Argumente Runtime.exec() ).

Hinweis: Das aktuelle Arbeitsverzeichnis kann aus Systemeigenschaftuser.dir gelesen werden. Sie könnten versucht sein, diese Systemeigenschaft zu setzen . Beachten Sie, dass dies zu sehr schlechten Inkonsistenzen führt, da es ist nicht beabsichtigt , beschreibbar zu sein .

56
Joachim Sauer

Siehe den Link unten (dies erklärt, wie es geht):

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

d.h.

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

Wenn Sie diesen exec-Befehl für eine Java-Laufzeitumgebung untersucht haben, erstellen Sie ein Dateiobjekt mit dem Pfad, den Sie "cd" angeben möchten, und geben Sie es als dritten Parameter für die exec-Methode ein.

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

Führt den angegebenen Zeichenfolgenbefehl in einem separaten Prozess mit der angegebenen Umgebung und dem angegebenen Arbeitsverzeichnis aus.

Dies ist eine bequeme Methode. Ein Aufruf des Formulars exec (command, envp, dir) verhält sich genauso wie das Aufrufprogramm exec (cmdarray, envp, dir), wobei cmdarray ein Array aller Token im Befehl ist.

Genauer gesagt, die Befehlszeichenfolge wird mithilfe eines StringTokenizer, der mit dem Aufruf new StringTokenizer (Befehl) erstellt wurde, in Token unterteilt, ohne dass die Zeichenkategorien geändert werden müssen. Die vom Tokenizer erzeugten Token werden dann in derselben Reihenfolge im neuen String-Array cmdarray abgelegt.

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

Dieser Befehl funktioniert gut

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

Versuchen Sie es mit:

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

Das hat funktioniert

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

Das folgende hat nicht funktioniert Während der Verwendung des Feldbefehls funktionierte NICHT 

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 verwende ein Dienstprogramm, um das Betriebssystem zu überprüfen, ob seine Fenster für andere als Windows-Programme funktionieren. cmd und/c

0
Dheeraj Sachan

Mit einer Methode des Process Builder können wir das Verzeichnis übergeben, in dem die Ausführung von cmd erwartet wird. Bitte sehen Sie das Beispiel unten. Sie können auch das Timeout für den Prozess mit der wait-Methode angeben.

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

        Process p = builder.start();

        p.waitFor(timeoutSec, TimeUnit.SECONDS);

Im obigen Code können Sie das Dateiobjekt des Pfads [an dem die Cmd erwartet wird ausgeführt werden] an die Verzeichnismethode von ProcessBuilder übergeben.

0
TechDog

Ich hatte dieses Problem gelöst, indem die Java-Anwendung ein SH-Skript ausführte, das sich im selben Verzeichnis befand und dann im SH-Skript die "CD" ausgeführt hatte.

Es war erforderlich, dass ich eine "CD" für ein bestimmtes Verzeichnis erstellt, damit die Zielanwendung ordnungsgemäß funktionieren kann.

0
Rami Del Toro