前言
最近更换deepin系统,在其上做项目,发现运行Java程序,File.delete有的目录下的文件,不能删除,有的能删除,反复对比文件属性及操作权限,均不得其解,最后发现采用Paths和Files得到解决!
我的问题
package com.stati.test;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.io.FileUtils;
import ch.qos.logback.core.util.FileUtil;
public class TestFile {
public static void main(String[] args) throws IOException, InterruptedException {
File file = new File("/home/tmpuser/tmp/test1/"); // 获取其file对象
File[] files = file.listFiles(); // 遍历path下的文件和目录,放在File数组中
for (File f : files) { // 遍历File[]数组
boolean flag = FileUtils.deleteQuietly(f);
System.out.println("------------------------"+flag);
if (f.delete()) // 若非目录(即文件),则打印
System.out.println("---删除文件成功----" + f.getAbsolutePath());
if (f.exists()) {
// System.gc();
Process process = Runtime.getRuntime().exec("rm -rf "+f.getAbsolutePath());
int exitValue = process.waitFor();
if (0 != exitValue) {
System.out.println("删除文件失败---" + f.getAbsolutePath());
} else {
System.out.println("删除文件成功---" + f.getAbsolutePath());
}
// System.out.println("---删除文件成功----" + f.getAbsolutePath());
}
}
}
}
以上代码捣鼓好久,硬是对/home/tmpuser/tmp/test1下的文件,删除不掉,无论我是重建目录,更改权限,都是失败!
以上代码我我采用至少三种方法:
1、FileUtils.deleteQuietly(f)
2、f.delete()
3、Runtime.getRuntime().exec("rm -rf "+f.getAbsolutePath());
均没有起作用,当时在网上,不断搜寻解决方案,反复都是一下三种:
1、多线程操作;
2、打开的文件流没有关闭;
3、需要垃圾回收下System.gc(); 。
我也反复核对我的项目代码,反复尝试,均不行!深入DEBUG代码,发现security == null
百思不得其解,说我的系统不安全(我的是deepin系统,大概1周没有重启电脑了),但是有一个目录可以删除……暂停!但是我想到jdk8中的Files、Path,居然解决了我的问题!
删除文件用jdk8的Files.delete(path)
package com.stati.test;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stre