Android无法执行rm -r

时间:2014-04-02 20:22:18

标签: java android shell rmdir

我的应用程序在SD卡上有一个目录。应用程序将注释保存在新的子目录中。我想使用shell命令“rm -r”删除整个子目录,但应用程序抛出异常:

04-02 23:14:23.410: W/System.err(14891): java.io.IOException: Error running exec(). Command: [cd, /mnt/sdcard/mynote, &&, rm, -r, aaa] Working Directory: null Environment: null

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:6)

这是因为您使用了Runtime.exec(String)。切勿使用此功能。它很难预测,只能在琐碎的情况下起作用。始终使用Runtime.exec(String[])

由于cd&&不是命令而是shell功能,因此您需要手动调用shell才能使其工作:

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "cd /mnt/sdcard/mynote && rm -r aaa"  
});

在相关的说明中,您永远不应将未转义的String数据传递给shell。例如,这是错误的:

// Insecure, buggy and wrong!
String target = "aaa";
Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "cd /mnt/sdcard/mynote && rm -r " + target  
});

正确的方法是将数据作为单独的参数传递给shell,并从命令中引用它们:

// Secure and correct
String target = "aaa";
Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "cd /mnt/sdcard/mynote && rm -r \"$1\"", "--", target
});

例如,如果文件名为*My file,则错误的版本将删除一大堆完全不相关的文件。正确的版本没有。