让我们说我有这个代码
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 /”),但也许有一种更简单的方法。
答案 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