61 votes

Comment utiliser la commande "cd" en utilisant le runtime Java ?

J'ai créé une application java autonome dans laquelle j'essaie de changer de répertoire à l'aide de 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 ?

0 votes

Un moyen de s'en sortir était de démarrer un nouveau shell et d'y envoyer toutes vos commandes - webmasterworld.com/linux/3613813.htm

69voto

Joachim Sauer Points 133411

Il n'y a pas d'exécutable appelé cd parce qu'il ne peut pas être mis en œuvre dans un processus distinct.

Le problème est que chaque processus a son propre répertoire de travail actuel et que la mise en œuvre de l'option cd en tant que processus séparé, ne changerait jamais que que traite le répertoire de travail actuel.

Dans un programme Java, vous ne peut pas changer votre répertoire de travail actuel et vous ne devriez pas avoir à le faire. Utilisez simplement les chemins de fichiers absolus.

Le seul cas où le répertoire de travail actuel a de l'importance est l'exécution d'un processus externe (à l'aide de la fonction ProcessBuilder o Runtime.exec() ). Dans ces cas, vous pouvez spécifier explicitement le répertoire de travail à utiliser pour le processus nouvellement lancé ( ProcessBuilder.directory() et le trois arguments Runtime.exec() respectivement).

Remarque : le répertoire de travail actuel peut être lu à partir de la balise [propriété du système](http://download.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties()) user.dir . Vous pourriez être tenté de set cette propriété du système. Notez qu'en procédant ainsi, vous obtiendrez très mauvaises incohérences parce que ce n'est pas signifiait pour être accessible en écriture .

0 votes

J'utilise runtime.exec(). Pouvez-vous me dire comment spécifier explicitement le répertoire de travail ?

1 votes

0 votes

@Jigar J'ai déjà vu cette question avant. Mais la solution utilise Executer mais je veux utiliser Runtime seulement.

24voto

user518066 Points 91

Voir le lien ci-dessous (qui 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);

14voto

Deepak Points 27

Avez-vous exploré cette commande d'exécution 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 la chaîne spécifiée dans un processus distinct avec l'environnement et le répertoire de travail spécifiés.

Il s'agit d'une méthode pratique. Une invocation de la forme exec(command, 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 tokens de command.

Plus précisément, la chaîne de commande est décomposée en jetons à l'aide d'un StringTokenizer créé par l'appel new StringTokenizer(command) sans autre modification des catégories de caractères. Les tokens 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

0 votes

Voici la réponse, je pense

0 votes

Oui, c'est la réponse qui a fonctionné pour moi : Cependant, gardez à l'esprit que le paramètre File dir doit être spécifié avec la dernière barre oblique incluse. Par exemple File dir = new File(" C:\\l\\workspace\\myproject\\mydirectory\\ ") ;

6voto

Cette commande fonctionne très bien

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

1 votes

Je ne comprends pas. Ça ne devrait pas être Runtime.getRuntime().exec("sh -c 'cd /path/to/dir && ProgToExecute'") ? Cela renvoie un code de sortie 2

3voto

TechDog Points 91

En utilisant l'une des méthodes du constructeur de processus, nous pouvons passer le répertoire dans lequel nous voulons que la commande soit exécutée. Veuillez voir l'exemple ci-dessous. Vous pouvez également mentionner le délai d'attente pour le 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 le cmd soit exécuté] à la méthode directory de ProcessBuilder

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X