2009-02-26 3 views
1

Я ищу, чтобы открыть командную строку и передать команду копирования, некоторые ключи и исходный файл плюс пункт назначения. Я пробовал код ниже, но ничего не происходит. Что я не вижу? Что я могу делать неправильно?CMD копия файла с Java

String line; 

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

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

p.waitFor(); 
+0

Пойдите, мой миньон! И ищите ответ на свой вопрос! – Zombies

ответ

8

Если вы действительно использовать внешнюю команду, то вы, вероятно, хотите выполнить (обратите внимание на/C):

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

Я рекомендую использовать версию массива из exec, чтобы избежать обращения процитировать (если какие-либо файлы или каталоги содержат пробелы - или двойные кавычки - в них):

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

Помните, что это не портативный (не будет работать на Unix), так что если вы действительно не нужно использовать COPY, то вы должны использовать метод, связанный с bstpierre.

+0

В чем разница между/C и/K еще раз? – OscarRyz

+0

@Oscar -/C закроет окно после выполнения,/K сохранит его. –

2

Есть ли причина, по которой вы не просто copying the file in Java, а не создаете системный процесс?

Копирование файлов с использованием Java вместо вызова exec приведет к переносу вашего кода.

+0

Если бы это был какой-то аромат * nix, я бы согласился, но на практике действительно сложно решить многие сетевые ресурсы Windows в Java, и он более прост, чтобы выполнять копии и удалять в оболочке. –

+1

Связанный пример - ужасная ссылка на копию двоичного файла; обрабатывает файл как символы (что происходит, если есть нечетное количество байтов) и ужасно неэффективно. –

+0

Не только плохой пример, но также есть новые и лучшие альтернативы с java 7, см. Мой ответ ниже. – bvdb

2

I второй комментарий bstpierre.

В связи с вашей конкретной проблемой, я считаю, что оболочка cmd не выйдет после ее создания. (edit: and Vlad указал, как это исправить)

Как и в других случаях, для других команд в будущем не забывайте избегать обратных косых черт: line = "cmd copy/yc: \\ srcfolder \ \ 112.bin C: \\ destfolder»

+0

Вы всегда можете проголосовать за мой ответ: D –

+0

На самом деле, с моей могущественной 1 репутацией, я не могу. –

+0

Упс, хорошая точка. Ну в таком случае, добро пожаловать в СО! –

1

попробовать

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

Однако, вы столкнетесь с проблемами, если у вас есть файлы и папки с пробелами в них. Я нашел наиболее надежный способ выполнения команд - использовать ProcessBuilder и передать команду со всеми аргументами в качестве параметров.

0

Используйте это, чтобы использовать версию Windows.

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

Альтернатива: Apache Commons IO обеспечивает хороший набор библиотек для обработки передачи файлов с чистой Java. В частности, посмотрите FileUtils.copyFileToDirectory (Файл srcFile, File destDir)

+0

хороший ответ в 2009 году, но с java 7 существует также метод 'Files # copy', который, вероятно, является лучшей альтернативой. – bvdb

0

Ahh, похоже, кто-то упомянул об этом, но я уточню (эпически, потому что тот, кто упоминал об этом, забыл процитировать их обратную косую черту в сообщении, делая это похоже на сингл!).

Таким образом, перечисленные решения лучше, но я уверен, что причина, по которой вы терпите неудачу, заключается в том, что в Java вы никогда не сможете использовать обратные косые черты как синглы, они являются символом цитаты, поэтому вам всегда нужно \\ внутри строка. И для двух обратных косых черт подряд, я думаю, вам нужно 6 или 8 из них !!?! ?? поищи это.

Fixed парня, который отправил его передо мной и дал ему +1

1

Для тех, отсылая к Apache Commons IO.

С java 7 есть также метод java.nio.Files#copy(Path, Path, CopyOption), что очень удобно. Вы можете найти дополнительную информацию here.

С java 7, использование Path объектов также предпочтительнее в пользу предыдущих File объектов.

Смежные вопросы