如何检查命令是否成功?

时间:2012-09-29 23:34:09

标签: java android shell su

让我们说我有这个代码

moveDirectory.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
    try{
        Process send = Runtime.getRunetime().exec(new String[] {"cd /sdcard/music/", "cp pic1 /sdcard/pic1"});
        send.waitFor();
    } catch (Exception ex){
        String toast = null;
        Log.i(toast, "Couldn't copy file", ex);
        }
    }
});

如果无法复制“pic1”,我该如何查看?所以我可以让用户知道使用Toast?我唯一的想法是在那之后编写代码以检查“pic1”是否在正确的路径中(在这种情况下为“/ sdcard /”),但也许有一种更简单的方法。

3 个答案:

答案 0 :(得分:1)

你可以阅读命令输出。在cp命令中,没有输出表示没有错误,如果有输出,您可以将其显示给用户以通知错误。

要阅读命令输出,您应该添加如下内容:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(send.getInputStream()));  

String line;  
ArrayList<String>  output = new ArrayList<String>(); 

while ((line = bufferedReader.readLine()) != null){ 
  output.add(line); 
} 
祝你好运。

答案 1 :(得分:1)

首先,您对 exec 的调用似乎不是预期的。根据文档,如果你传递一个String数组,数组的第一个元素是命令,其余的参数。这里有两个命令。

您可以使用一个命令非常轻松地编写它并使用exec的单个String调用:

  Process send = Runtime.getRuntime().exec("cp /sdcard/music/pic1 /sdcard/pic1");

其次, waitFor 不会抛出任何异常,以表明命令没有成功。根据文档,他们只检查将抛出的异常是指示当前线程已被中断,在这种情况下,命令有可能甚至没有完成。

您需要做的是检查流程的退出状态代码。这是 waitFor 方法返回的值。通常的做法是,进程/程序返回状态0表示成功,其他值表示错误。所以代码应该是:

  Process send = Runtime.getRunetime().exec("cp /sdcard/music/pic1 /sdcard/pic1");
  try {
    if (send.waitFor() != 0) {
        String toast = null;
        Log.i(toast, "Couldn't copy file", ex);
    }
  } catch (InterruptedException e) {
    // up to you how to recover this situation.
  } 

第三,也是最重要的......如果您想要做的是复制文件,则无需为此调用系统。您可以使用 java.io API编写自己的文件复制程序...但最好重用apache commons FileUtils 帮助类。

import org.apache.commons.io.FileUtils;
import java.io.File;

...
FileUtils.copyFile(new File("/sdcard/music/pic1"),new File("/sdcard/music"))
...

答案 2 :(得分:0)

您是否尝试过send.exitValue()然后检查它是否是错误代码,如-1

相关问题