2011-12-23 14 views
2

現在、Runtime.execでxcopyを使用してファイルをコピーするJavaプログラムがあります。しかし、問題は現在、ファイル名に中国語の文字がある場合、これは機能しません。 ファイルが見つかりませんでした。 しかし、私がエクスプローラからファイルパスをコピーし、コマンドラインからxcopyをコピーするとコピーが機能します。 私はWindows 7マシンから実行しています。どんな解決策も高く評価されます。Javaを使用しているWindows xcopy Runtime.execは中国語のファイル名では機能しません

おかげ

これはバグhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4947220に関連しています。引数を引数として渡す代わりに、完全に機能する環境変数を渡します。

+0

代わりにProcessBuilderを試しましたか?それはRunime.exec()よりも良いと思われます –

+0

これも試してみましたが無駄に... – rcs

答えて

1

あなたは大きなファイル、またはファイルとすべてコピーする必要がある場合:java.nio.file.Files

Path a = ... 
Path b = ... 

Files.copy(a,b); 

ドキュメントについてはこちらを参照してくださいでそれを行うには

てみてくださいJavaの内部File.copy()を使用するとファイルに関連付けられたシステム権限が高すぎるため、すべての負荷をシステムにオフロードできます。

次のトリックファーストのユーザー文字列配列をexec()の引数として試してみてください。 2番目に、 'cmd'コマンドのあとに/ C引数をつけてパイプで 'xcopy'を実行してください。私がisWindows()呼び出しを行う行の近くのサンプルコードを見てください。

xcopyコマンドはCMDシェル内で実行され、/ Cは正常に実行された後に終了します。 CMD.exeの詳細

public int sysCopyFile(Resource fromResource, Resource toResource) throws ServiceException { 
    int returnCode = -1; 
    try { 
     String[] copyCommand = null; 

     if (IOUtils.isWindows()) { 
      copyCommand = new String[] {"cmd", "/C", "copy", "/Y", fromResource.getFile().getAbsolutePath(), toResource.getFile().getAbsolutePath()}; 
     } else if (IOUtils.isUnix() || IOUtils.isMac()) { 
      copyCommand = new String[] {"/bin/cp", "-pr", fromResource.getFile().getAbsolutePath(),toResource.getFile().getAbsolutePath()}; 
     } 

     final Process p = Runtime.getRuntime().exec(copyCommand); 
     new StreamLogger(p.getErrorStream(), log, StreamLogger.WARN); 
     new StreamLogger(p.getInputStream(), log, StreamLogger.DEBUG); 

     returnCode = p.waitFor(); 

     if (returnCode != 0) throw new ServiceException("Unable to to copy. Command: {" + copyCommand[0] + "} has returned non-zero returnCode: " + returnCode); 
    } catch (IOException e) { 
     throw new ServiceException(e); 
    } catch (InterruptedException e) { 
     throw new ServiceException(e); 
    } 
    return returnCode; 
} 
+0

Seego。返信ありがとうございます。しかし、これはxcopyに変更しても機能しません。それは私にファイルが見つかりません – rcs

+0

コンソールにcopyCommand配列を印刷し、コマンドが正しく作成されているかどうかを確認します – Seego

+0

これは私のコマンドがcmd = new String [] {"cmd"、 "/ C"、 "xcopy" "/ R"、 "/ C"、 "/ Y"、 "/ S"、source.getAbsolutePath()、destPath.getCanonicalPath()}; – rcs

2

Javaのexecは、文字列をシステムコードページに変換します。 XXI世紀のために、恥ずかしいですが、それはそうです。

しかし、ここではJavaだけがボトルネックではありません。コンソールにも問題があり、xcopyにはそれ自身のシェアがあるかもしれません。

たとえば、cmd.exeをUnicode(/ U)として起動したり、コードページをutf-8(chcp 65001)に設定したり、バッチファイルを作成するなど、さまざまな方法があります。そのコマンドとそのバッチを呼び出す(exec関数ではhigh-asciiは使用しない)。 しかし、私はそれを中継しません。

すべてがWindowsのみであるため、「適切な」execを実装するためにjniを使用するか、FileCopyがJavaのコピーより高速かどうかを確認します。

関連する問題