2011-12-23 49 views
2

我目前有一個java程序,它使用xcopy和Runtime.exec來複制文件。但現在的問題是,當文件名有中文字符時,這不起作用。 它給出了文件未找到錯誤。 但是,如果我從資源管理器複製文件路徑,並從命令行復制工作xcopy。 我正在從Windows 7機器執行它。任何解決方案將不勝感激。使用java的Windows xcopy Runtime.exec不能用於中文字符的文件名

感謝

這是關係到錯誤http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4947220。不是將參數作爲參數傳遞,而是通過完美運行的環境變量傳遞它們。

+0

您是否嘗試使用ProcessBuilder?它應該比Runime.exec() – 2011-12-23 22:23:30

+0

也嘗試過...但徒勞無功... – rcs 2011-12-28 23:59:06

回答

1

如果需要拷貝大文件或文件和所有與文件相關的系統權限,使用java內部的File.copy()將會過於昂貴,因此您可以將所有負載卸載到您的系統中。請嘗試以下技巧 - 首先,將用戶字符串數組作爲exec()的參數嘗試以下技巧:首先,將用戶字符串數組作爲exec()的參數。其次,在使用/ C參數的'cmd'命令後在管道中執行'xcopy'。看看我使isWindows()調用的線附近的示例代碼。

訣竅是您的xcopy命令將在CMD shell內部執行,並且/ 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.Thanks for the reply。但是,當我更改爲xcopy時,這也不起作用。它給我沒有找到文件 – rcs 2011-12-23 22:28:48

+0

打印出控制檯上的copyCommand數組,並檢查命令是否正確創建 – Seego 2011-12-23 22:33:35

+0

這是我的命令如何看起來像cmd = new String [] {「cmd」,「/ C」,「xcopy」, 「/ R」,「/ C」,「/ Y」,「/ S」,source.getAbsolutePath(),destPath.getCanonicalPath()}; – rcs 2011-12-28 18:33:18

2

Java中的exec將字符串轉換爲系統代碼頁。 可恥的,對於二十一世紀來說,但事實就是如此。

但是Java並不是這裏唯一的瓶頸。控制檯也是有問題的,而xcopy可能有它自己的份額。

可以嘗試很多voodoo,例如將cmd.exe作爲Unicode(/ U)啓動,和/或將代碼頁設置爲utf-8(chcp 65001),或者創建批處理文件該命令並調用該批處理(因此exec函數中沒有高ascii)。 但我不會繼續。

因爲無論如何一切都是Windows,所以我可能會嘗試使用jni來實現「正確的」exec,或者查看FileCopy是否比Java副本更快。

相關問題