4 votes

Linux copie des fichiers à partir d'un programme Java

J'ai écrit un petit code java avec l'API getRuntime() pour copier des fichiers d'un répertoire à un autre, mais il échoue, je n'arrive pas à comprendre pourquoi ? Lorsque j'exécute la commande à partir de l'interpréteur de commandes, elle s'exécute correctement.

    private static void copyFilesLinux(String strSource, String strDestination) {

    String s;
    Process p;
    try {
        // cp -R "/tmp/S1/"*  "/tmp/D1/"
        p = Runtime.getRuntime().exec(
                "cp -R '" + strSource + "/'* '" + strDestination + "/'");
        System.out.println("cp -R \"" + strSource + "/\"* \"" + strDestination + "/\"");
        System.out.println("cp -R '" + strSource + "/'* '" + strDestination + "/'");
        System.out.println(p.toString());
        BufferedReader br = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        while ((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println("exit: " + p.exitValue());
        p.destroy();
    }
    catch (InterruptedException iex) {
        iex.printStackTrace();
    }
    catch (IOException iox) {
        iox.printStackTrace();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

}

Sortie :

cp -R "/tmp/S1/"* "/tmp/D1/"

cp -R '/tmp/S1/'* '/tmp/D1/'

java.lang.UNIXProcess@525483cd

exit: 1

4voto

Sandeep540 Points 323

Il fonctionne avec le code ci-dessous,

            String[] b = new String[] {"bash", "-c", "cp -R \"" + strSource + "/\"* \"" + strDestination + "/\""};  
        p = Runtime.getRuntime().exec(b);

J'ai fait une recherche sur Google et j'ai trouvé le lien

http://www.coderanch.com/t/423573/java/java/Passing-wilcard-Runtime-exec-command

2voto

thkala Points 36148

Lorsque vous utilisez une variante de Runtime.exec() le binaire est appelé directement plutôt que par l'intermédiaire d'une coquille. Cela signifie que les caractères génériques ne sont pas pris en charge car il n'y a pas de coquille pour les étendre.

Je vous suggère d'utiliser du code Java pour copier vos fichiers - ce serait bien plus portable et bien plus sûr. À moins que vous n'utilisiez le code Java pour copier vos fichiers, il serait beaucoup plus portable et plus sûr. peut utiliser un binaire de l'interpréteur de commandes pour exécuter votre commande via sa fonction -c option.

1voto

Vasyl Keretsman Points 687

Vous pouvez le faire en utilisant l'api Java standard, sauf si vous avez vraiment besoin d'exécuter des commandes système.

http://docs.oracle.com/javase/tutorial/essential/io/copy.html

1voto

Shubham Laddha Points 21

Cela a fonctionné pour moi avec le code suivant.

 public static void main(String []args) throws Exception{
        String s;
        Process p;
        try {
            String b[] = new String[4];
            b[0] = "cp";
            b[1] = "-R";
            b[2] = "HelloWorld.java";
            b[3] = "abc.java";

            p = Runtime.getRuntime().exec(b);
            BufferedReader br = new BufferedReader(
                new InputStreamReader(p.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println("line: " + s);
            p.waitFor();
            System.out.println ("exit: " + p.exitValue());
            p.destroy();
        } catch (Exception e) {}        
     }
}

Créer un String[] de commandes et de passer les commandes à l'intérieur de celui-ci.

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