2013-02-17 60 views
0

我正在用busybox的設備。 文件夾或文件,沒有空格正確地移動,但似乎與空格的文件夾不正確地移動用空格busybox的MV失敗默默

public static boolean mv(File source, File target) { 
    if (!source.exists() || !target.exists()) { 
     return false; 
    } 
    try { 
     StringBuilder command = new StringBuilder("mv -v "); 
     command.append('\"'); 
     command.append(source.getCanonicalPath()); 
     command.append('\"'); 
     command.append(' '); 
     command.append('\"'); 
     command.append(target.getCanonicalPath()); 
     command.append('\"'); 
     System.out.println(command.toString()); 
     Process process = Runtime.getRuntime().exec(command.toString()); 
     StringBuilder output = new StringBuilder(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      output.append(line); 
     } 
     System.out.println(output.toString()); 
     return process.waitFor() == 0; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

輸出是

mv -v "/storage/sdcard0/media/music/Progressive Death Metal" "/storage/sdcard0/Music" 

沒有MV輸出,方法只是返回「假」(非-zero退出代碼)。

我必須使用規範的路徑,或者是好的使用絕對路徑,讓它殼?

編輯

我也來了,如果文件名有引號,參數將是錯誤的,所以我做了一個方法添加轉義字符

private static String getCommandLineString(String input) { 
    return input.replace("\\", "\\\\") 
      .replace("\"", "\\\"") 
      .replace("\'", "\\\'") 
      .replace("`", "\\`") 
      .replace(" ", "\\ "); 
} 

現在MV拍得像這樣

public static boolean mv(File source, File target) { 
    if (!source.exists() || !target.exists()) { 
     return false; 
    } 
    try { 
     StringBuilder command = new StringBuilder("mv -v "); 
     command.append(getCommandLineString(source.getAbsolutePath())); 
     command.append(' '); 
     command.append(getCommandLineString(target.getAbsolutePath())); 
     System.out.println(command.toString()); 
     Process process = Runtime.getRuntime().exec(command.toString()); 
     StringBuilder output = new StringBuilder(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      output.append(line); 
     } 
     System.out.println(output.toString()); 
     return process.waitFor() == 0; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

什麼,我得到的是

mv -v /sdcard/media/music/Progressive\ Death\ Metal /sdcard/Music 

但我仍得到沉默的非零退出代碼。

回答

0

終於得到它的工作。 Exec應該要求shell,而OutputStream應該寫入命令。

private static boolean execute(boolean superuser, String command) { 
    DataOutputStream os = null; 
    try { 
     Process process = Runtime.getRuntime().exec(superuser ? "su" : "sh"); 
     os = new DataOutputStream(process.getOutputStream()); 
     os.writeBytes(command + "\n"); 
     os.flush(); 

     os.writeBytes("exit\n"); 
     os.flush(); 

     return process.waitFor() == 0; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (os != null) { try { os.close(); } catch (Exception e) {} } 
    } 
    return false; 
} 

public static boolean mv(File source, File target) { 
    if (!source.exists() || !target.exists()) { 
     return false; 
    } 
    try { 
     StringBuilder command = new StringBuilder("mv "); 
     command.append(getCommandLineString(source.getAbsolutePath())); 
     command.append(' '); 
     command.append(getCommandLineString(target.getAbsolutePath())); 
     return execute(false, command.toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
}