2

可以说我有这个代码

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/”),但也许有更简单的方法。

4

3 回答 3

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); 
} 

祝你好运。

于 2012-09-29T23:53:52.867 回答
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"))
...
于 2012-09-30T00:39:20.250 回答
0

您是否尝试过 send.exitValue() 然后检查它是否是像 -1 这样的错误代码

于 2012-09-29T23:44:05.907 回答