Java Android无法执行rm-r

Java Android无法执行rm-r,java,android,shell,rmdir,Java,Android,Shell,Rmdir,我有一个在SD卡上有目录的应用程序。应用程序将注释保存在新的子目录中。我想使用shell命令rm-r删除整个子目录,但应用程序引发异常: 04-02 23:14:23.410:W/System.err14891:java.io.IOException:运行exec时出错。命令:[cd,/mnt/sdcard/mynote,&&,rm,-r,aaa]工作目录:null环境:null 有人能帮我吗?发生这种情况是因为您使用了Runtime.execString。切勿使用此功能。这是很难预测的,而且只

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

04-02 23:14:23.410:W/System.err14891:java.io.IOException:运行exec时出错。命令:[cd,/mnt/sdcard/mynote,&&,rm,-r,aaa]工作目录:null环境:null


有人能帮我吗?

发生这种情况是因为您使用了Runtime.execString。切勿使用此功能。这是很难预测的,而且只适用于琐碎的情况。始终使用Runtime.execString[]

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

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "cd /mnt/sdcard/mynote && rm -r aaa"  
});
另一个相关的注意事项是,您永远不应该将未经转换的字符串数据传递给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
});

例如,如果文件名为*或“我的文件”,则不正确的版本将删除一大堆完全不相关的文件。正确的版本不正确。

发生这种情况是因为您使用了Runtime.execString。切勿使用此功能。这是很难预测的,而且只适用于琐碎的情况。始终使用Runtime.execString[]

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

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "cd /mnt/sdcard/mynote && rm -r aaa"  
});
另一个相关的注意事项是,您永远不应该将未经转换的字符串数据传递给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
});

例如,如果文件名为*或“我的文件”,则不正确的版本将删除一大堆完全不相关的文件。正确的版本则不然。

您真的应该使用java文件操作来完成这项工作,而不是执行一个进程——正如您所发现的,这是一个棘手且不可移植的过程。但是,如果您确实需要当前尝试的帮助,则需要发布代码。首先,看起来您正试图发出一系列命令。与其尝试更改到有问题的目录,不如将其指定为rm的一个参数。您真的应该使用java文件操作来执行此操作,而不是执行一个进程—正如您所发现的,这是一个棘手且不可移植的过程。但是,如果您确实需要当前尝试的帮助,则需要发布代码。首先,看起来您正试图发出一系列命令。与其尝试更改到有问题的目录,不如将其指定为rm的参数。感谢您的回答,此参数可能重复。我明天试试,因为现在太迟了。谢谢你的回答。我明天试试,因为现在太迟了。