Question

J'ai créé une application Java autonome dans laquelle j'essaye de changer de répertoire en utilisant la commande "cd" dans le terminal Ubuntu 10.04.J'ai utilisé le code suivant.

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

Mais le code ci-dessus donne l'erreur suivante

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

Quelqu'un peut-il me dire comment le mettre en œuvre?

Était-ce utile?

La solution

Il n'y a pas d'exécutable appelé cd, car il ne peut pas être implémenté dans un processus séparé.

Le problème est que chaque processus a son propre répertoire de travail actuel et l'implémentation de cd en tant que processus séparé ne changerait jamais que qui traite le répertoire de travail actuel.

Dans un programme Java, vous ne pouvez pas modifier votre répertoire de travail actuel et vous ne devriez pas avoir besoin de le faire. Utilisez simplement des chemins de fichiers absolus.

Le seul cas où le répertoire de travail actuel compte est l'exécution d'un processus externe (en utilisant ProcessBuilder ou Runtime.exec()). Dans ces cas, vous pouvez spécifier explicitement le répertoire de travail à utiliser pour le processus nouvellement démarré ( ProcessBuilder.directory() et code Runtime.exec() à trois arguments respectivement).

Remarque: le répertoire de travail actuel peut être lu à partir du propriété système user.dir. Vous pourriez être tenté de définir cette propriété système. Notez que cela entraînera des de très mauvaises incohérences , car il n'est pas censé être accessible en écriture .

Autres conseils

Voir le lien ci-dessous (ceci explique comment faire):

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

c'est-à-dire:

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

Avez-vous exploré cette commande exec pour un runtime java, créez un objet fichier avec le chemin vers lequel vous voulez "cd", puis saisissez-le comme troisième paramètre pour la méthode exec.

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

Exécute la commande de chaîne spécifiée dans un processus séparé avec l'environnement et le répertoire de travail spécifiés.

C'est une méthode pratique.Un appel de la forme exec (commande, envp, dir) se comporte exactement de la même manière que l'invocation exec (cmdarray, envp, dir), où cmdarray est un tableau de tous les jetons de la commande.

Plus précisément, la chaîne de commande est divisée en jetons à l'aide d'un StringTokenizer créé par l'appel new StringTokenizer (commande) sans autre modification des catégories de caractères.Les jetons produits par le tokenizer sont ensuite placés dans le nouveau tableau de chaînes cmdarray, dans le même ordre.

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

Cette commande fonctionne très bien

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

Essayez d'utiliser:

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

Cela a fonctionné

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

Ce qui suit n'a pas fonctionné Lors de l'utilisation de la commande array n'a PAS FONCTIONNÉ

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

Pour info, j'utilise un utilitaire pour vérifier le système d'exploitation si ses fenêtres ci-dessus fonctionnent pour d'autres que Windows supprimez cmd et /c

En utilisant l'une des méthodes du générateur de processus, nous pourrions passer le répertoire où nous nous attendons à ce que la cmd soit exécutée.Veuillez consulter l'exemple ci-dessous.Vous pouvez également mentionner le délai d'expiration du processus, en utilisant la méthode wait for.

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

        Process p = builder.start();

        p.waitFor(timeoutSec, TimeUnit.SECONDS);

Dans le code ci-dessus, vous pouvez passer l'objet fichier du chemin [où nous attendons que la cmd soit exécutée] à la méthode de répertoire de ProcessBuilder

J'avais résolu ce problème en demandant à l'application Java d'exécuter un script sh qui se trouvait dans le même répertoire, puis dans le script sh j'avais fait le "cd".

Il était nécessaire que je fasse un "cd" dans un répertoire spécifique pour que l'application cible puisse fonctionner correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top