这是我删除文件夹的代码,下面的代码不会删除主文件夹下的Downloads目录。
import java.io.IOException;
public class tester1{
public static void main(String[] args) throws IOException {
System.out.println("here going to delete stuff..!!");
Runtime.getRuntime().exec("rm -rf ~/Downloads/2");
//deleteFile();
System.out.println("Deleted ..!!"); }
}
但是,如果我给出完整的主路径,则可行:
import java.io.IOException;
public class tester1{
public static void main(String[] args) throws IOException {
System.out.println("here going to delete stuff..!!");
Runtime.getRuntime().exec("rm -rf /home/rah/Downloads/2");
//deleteFile();
System.out.println("Deleted ..!!");
}
}
有谁能告诉我我做错了什么。?
答案 0 :(得分:7)
波形符号(~
)由shell扩展。当您调用exec
时,不会调用shell,而是立即调用rm
二进制文件,因此不会扩展波形符。也不是通配符和环境变量。
有两种解决方案。要么自己替换代字号:
String path = "~/Downloads/2".replace("~", System.getProperty("user.home"))
或通过在命令行前面添加前缀来调用shell
Runtime.getRuntime().exec("sh -c rm -rf ~/Downloads/2");
答案 1 :(得分:3)
波浪线扩展由shell(例如bash)完成,但是,您直接运行rm
,因此没有shell来解释~
。我强烈建议不要依赖于调用shell来执行此类功能 - 它们容易出错,安全性能较差,并且限制了代码可以运行的操作系统。
但是,如果你真的决定使用这种特殊方法,你可以这样做:
Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "rm -rf ~/Downloads/2" })
答案 2 :(得分:1)
您使用的是没有shell的shell语法。将命令更改为:
new String[]{"sh", "-c", "rm -rf ~/Downloads/2"}
答案 3 :(得分:0)
如果不需要使用代字号,则可以使用环境变量,例如$ HOME。
String homeDir = System.getenv("HOME");
Runtime.getRuntime().exec("rm -rf " + homeDir + "/Downloads/2");