java删除文件夹的踩坑经

在Java代码中,作者遇到了一个私有化部署时删除目录的问题,特别是涉及失效软链接文件时会报错。原来的问题在于,代码首先检查是否为文件并尝试删除,而失效的软链接被`isFile()`视为非文件。解决方案是先判断是否为文件夹,如果是则递归删除,否则直接删除。修改后的代码成功解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

删除目录的代码,递归子文件夹,没有如果是文件则删除,上线运行过程中一直没有问题,但一次私有化部署时,删除文件夹总是报错,经过排查是因为一些失效的软链接文件删除不掉(手动是可以删除的,权限也验证没问题)

public void delDir(String path) {
       try {
			Path dirPath = Paths.get(path);
			if (Files.exists(dirPath) && Files.isDirectory(dirPath)) {
				File dirPathFile = dirPath.toFile();
				if (null == dirPathFile) {
					return;
				}
				File[] files = dirPathFile.listFiles();
				if (null == files) {
					return;
				}
				for (File file : files) {
					if (file.isFile()) {
						file.delete();
					} else {
						delDir(file.getPath());
					}
				}
				Files.delete(dirPath);
			}
		} catch (Exception e) {
			log.error("删除目录失败,path = {}", path, e);
			Assert.state(false, "删除目录失败");
		}
	}

最终发现,if (file.isFile())   判断失效的软链接文件时,返回了false,  惊讶!  软链接文件就不是文件么? 进入isFile() 代码看,

Tests whether the file denoted by this abstract pathname is a normal file.

normal file是什么? 以后继续了解,看到此文章的,可以评论下,总之先解决问题吧,删除文件夹的代码改成下面的方式,改成先判断是不是文件夹

public void delDir(String path) {
       try {
			Path dirPath = Paths.get(path);
			if (Files.exists(dirPath) && Files.isDirectory(dirPath)) {
				File dirPathFile = dirPath.toFile();
				if (null == dirPathFile) {
					return;
				}
				File[] files = dirPathFile.listFiles();
				if (null == files) {
					return;
				}
				for (File file : files) {
                   if(file.isDirectory()){  //先判断是不是文件夹
                        delDir(file.getPath());
                    }
                    else{   //这样就覆盖到了删除失效的软链接情况
                        file.delete();
                    }
				}
				Files.delete(dirPath);
			}
		} catch (Exception e) {
			log.error("删除目录失败,path = {}", path, e);
			Assert.state(false, "删除目录失败");
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值