file.delete()无法删除文件的问题排查思路
一般遇到这种问题,需要思考,没有删除的文件是什么原因造成的,常见的有:
1. 第一种是不是你本地打开该文件,导致系统占用该文件,这种先自查。
2. 代码种有对该文件操作的流未全部关闭,导致文件被java进程占用无法上传。
3. 要删除的文件名称路径是否有错误,导致文件不存在。
4. 假如是文件夹需要看文件夹下面是否有文件,一般文件夹如果有文件,删除虽然不会报错,但是返回的是false,也不能删除。
上代码:第一版 第一次考虑到可能是文件被占用,所以使用GC打算释放资源,结果失败了
/**
* @description: 删除单个文件
* @params [descDir]
* @author: silencer
* @version: 1.0.Rel
* @date: 2021/4/2 11:30
*/
public static void deleteZipFile(String descDir) {
File file =new File(descDir);
File[] files = file.listFiles(pathname -> {
if (pathname.isFile() && pathname.getName().endsWith(".zip")) {
return true;
}
return false;
});
Arrays.stream(files).forEach(e->{
logger.info("已删除源文件:{}",files.length);
System.gc();
e.delete();
});
}
改正后 第二版 细看 发现是zip文件流未关闭,关闭即可
/***
* @description: 解压文件到指定目录
* @params /
* @author: silencer
* @version: 1.0.Rel
* @date: 2021/4/2 11:08
*/
public static void unZipFiles(File zipFile, String descDir) throws IOException {
File pathFile = new File(descDir);
if (!pathFile.exists()) {
pathFile.mkdirs();
}
//解决zip文件中有中文目录或者中文文件
ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));
for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
if (!file.exists()) {
file.mkdirs();
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if (new File(outPath).isDirectory()) {
continue;
}
//输出文件路径信息
System.out.println(outPath);
OutputStream out = new FileOutputStream(outPath);
byte[] buf1 = new byte[1024];
int len;
while ((len = in.read(buf1)) > 0) {
out.write(buf1, 0, len);
}
in.close();
out.close();
}
//如果zip包不关闭,就无法删除zip
zip.close();
//确保没有多层结构压缩文件
//删除压缩文件
zipFile.delete();
// 递归查找zip文件,解压并删除
recursion(descDir);
}
以上就解决了,写代码还是要细心一点,仔细检查有时候不是什么大问题,而是我们太粗心。