2009-02-26 7 views
1

私はコマンドプロンプトを開き、コピーコマンド、いくつかのスイッチ、およびソースファイルとデスティネーションを渡したいと考えています。私は以下のコードを試しましたが、何も起こっていないようです。私は何を見ていないのですか?私は何が間違っていますか?JavaからのCMDファイルのコピー

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上では動作しません)これは、ポータブルではないことに注意してくださいの場合は、bstpierreにリンクされているメソッドを使用する必要があります。

+0

/Cと/ Kの違いは何ですか? – OscarRyz

+0

@Oscar -/Cは実行後にウィンドウを閉じる、/ Kはそれを開いたままにします。 –

2

システムプロセスを作成するのではなく、単にcopying the file in Javaという理由がありますか?

execコールではなくJavaを使用してファイルをコピーすると、コードを移植性のある状態に保つことができます。

+0

もしこれがいくつかの* nix風味だったら、私は同意しますが、実際にはJavaで多くのWindowsネットワークリソースに対処することは実際には難しく、シェルでコピーと削除を実行するほうが堅牢です。 –

+1

リンクされた例は、バイナリファイルコピーのひどい参照です。ファイルを文字として扱います(バイト数が奇数の場合はどうなりますか)、ひどく非効率です。 –

+0

悪い例だけでなく、Java 7以降の新しい優れた選択肢もあります。下記の私の答えを見てください。 – bvdb

2

I second bstpierreさんのコメント

あなたの特定の問題に関しては、作成したcmdシェルが終了していないと思います。 (編集:そしてVladはそれを修正する方法を指摘しました)

これ以外にも、バックスラッシュをエスケープすることを忘れないでください: line = "cmd copy/yc:\\ srcfolder \ \ 112.bin C:\\ destfolder」

+0

あなたはいつも私の答えを投票することができます:D –

+0

実際、私の強大な評判で、私はできません。 –

+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、ファイルdestDir)を見てください。

+0

2009年には良い答えですが、Java 7以来、おそらくもっと良い選択肢である 'Files#copy'メソッドもあります。 – bvdb

0

ああ、誰かが言及したように見えますが、私は明らかにします(叙述したのは、それがバックスラッシュをポストで引用して忘れていたからです。それは単一のように見える!)。

しかし、あなたが失敗した理由は、Javaではバックスラッシュをシングルとして使うことはできないということです。彼らは引用文字なので、常に\\を内部に入れる必要があります文字列。また、2つのバックスラッシュを連続して入力すると、6つまたは8つが必要になると思います!!調べる。

私の前にそれを掲示し、彼にApache Commons IOに参照のうえ、それらのために1

1

を与えた男を修正しました。

Java 7以降、java.nio.Files#copy(Path, Path, CopyOption)メソッドもあり便利です。詳細はhereをご覧ください。

Java 7以降では、Pathオブジェクトの使用も、前のFileオブジェクトを優先して使用します。

関連する問題