Копирование файла CMD с Java

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

String line;

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

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

p.waitFor();

Ответов (7)

Решение

Если вам действительно нужно использовать внешнюю команду, вы, вероятно, захотите выполнить (обратите внимание на / 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 .

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

CMD / C КОПИРОВАТЬ /YC:\srcfolder\112.bin C: \ destfolder

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

Для тех, кто имеет отношение к Apache Commons IO .

Начиная с java 7 тоже есть java.nio.Files#copy(Path, Path, CopyOption)метод, что очень удобно. Вы можете найти больше информации здесь .

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

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

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

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

пытаться

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

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

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

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

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

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

Исправил парня, который разместил это до меня, и поставил ему +1