2009-02-26 9 views
1

Je cherche à ouvrir une invite de commande et passer une commande de copie, certains commutateurs et le fichier source plus la destination. J'ai essayé le code ci-dessous mais rien ne semble se produire. Qu'est-ce que je ne vois pas? Que pourrais-je faire de mal?Copie de fichier CMD à partir de Java

String line; 

line = "cmd COPY /Y C:\srcfolder\112.bin C:\destfolder"; 

Process p = Runtime.getRuntime().exec(line); 

p.waitFor(); 
+0

Allez, mon serviteur! Et cherchez la réponse à votre question! – Zombies

Répondre

8

Si vous avez vraiment d'utiliser une commande externe, alors vous voudrez probablement à exécuter (notez le/C):

CMD /C COPY /Y C:\srcfolder\112.bin C:\destfolder 

Je vous recommande d'utiliser la version du tableau de exec pour éviter la manipulation de citer (si des fichiers ou des répertoires contiennent des espaces - ou doubles guillemets - en eux):

String[] args = { "CMD", "/C", "COPY", "/Y", src_file, dest_folder }; 
Process p = Runtime.getRuntime().exec(args); 
p.waitFor(); 

Rappelez-vous que ce n'est pas portable (ne fonctionne pas sur Unix), donc à moins que vous avez vraiment vraiment besoin d'utiliser COPY alors vous devriez utiliser la méthode liée à par bstpierre.

+0

Quelle était la différence entre/C et/K à nouveau? – OscarRyz

+0

@Oscar -/C fermera la fenêtre après l'exécution,/K la gardera ouverte. –

2

Y a-t-il une raison pour laquelle vous n'êtes pas simplement copying the file in Java plutôt que de créer un processus système?

La copie des fichiers à l'aide de Java plutôt que d'un appel exec garderait votre code portable.

+0

S'il s'agissait d'une saveur * nix, je serais d'accord, mais en pratique, il est vraiment difficile d'adresser beaucoup de ressources réseau Windows en Java et c'est plus robuste juste pour exécuter des copies et des suppressions dans le shell. –

+1

L'exemple lié est une référence terrible pour une copie de fichier binaire; traite le fichier comme des caractères (ce qui se passe s'il y a un nombre impair d'octets) et est terriblement inefficace. –

+0

Non seulement un mauvais exemple, mais il existe aussi de nouvelles et meilleures alternatives depuis Java 7, voir ma réponse ci-dessous. – bvdb

2

Je seconde le commentaire de bstpierre.

En référence à votre problème particulier, je crois que le shell cmd ne se ferme pas après l'avoir créé. (edit: et Vlad a indiqué comment corriger cela)

En aparté, pour d'autres commandes dans le futur, n'oubliez pas d'échapper vos barres obliques inverses: line = "cmd copy/yc: \\ srcfolder \ \ 112.bin c: \\ destfolder »

+0

Vous pouvez toujours voter ma réponse: D –

+0

En fait, avec ma réputation 1 puissante, je ne peux pas. –

+0

Oups, bon point. Bien dans ce cas, bienvenue à SO! –

1

essayer

line = "cmd /C COPY /Y C:\srcfolder\112.bin C:\destfolder"; 
Process p = Runtime.getRuntime().exec(line); 
p.waitFor(); 

Cependant, vous rencontrez des problèmes si vous avez des fichiers et des dossiers avec des espaces en eux. J'ai trouvé le moyen le plus robuste d'exécuter des commandes est d'utiliser ProcessBuilder, et passer dans la commande avec tous les arguments en tant que paramètres.

0

Utilisez la pour utiliser la version Windows.

CMD/C COPIER/Y C: \ srcfolder \ 112.bin C: \ destfolder

Une alternative: Apache Commons IO fournit une belle série de bibliothèques pour gérer les transferts de fichiers avec Java pur. Plus précisément à regarder FileUtils.copyFileToDirectory (Fichier SRCFILE, fichier DestDir)

+0

bonne réponse en 2009, mais depuis java 7 il y a aussi une méthode 'Files # copy', ce qui est probablement une meilleure alternative. – bvdb

0

Ahh, ressemble à quelqu'un en a parlé, mais je vais préciser (epically parce que celui qui en a parlé oublié de citer leur backslash dans le poste, ce qui ça ressemble à un seul!). Donc les solutions listées sont meilleures, mais je suis presque sûr que la raison pour laquelle vous échouez est qu'en Java vous ne pouvez jamais utiliser les barres obliques en tant que simples, elles sont le caractère de la citation, donc vous avez toujours besoin de \\ dans un chaîne. Et pour 2 backslashes d'affilée, je pense que vous avez besoin de 6 ou 8 d'entre eux !!?! ?? le chercher.

fixe le gars qui a écrit avant moi et lui a donné un +1

Questions connexes