使用Java SimpleFileVisitor无法删除文件问题求助
搞定SimpleFileVisitor删不掉文件的问题
你的代码思路是对的,但删不掉文件大概率是两个小坑导致的,咱们来一步步解决:
第一个坑:文件名匹配逻辑错了!
你用file.getFileName().endsWith(".rule")来判断目标文件,但getFileName()返回的是Path对象,不是字符串!这个endsWith方法是用来比较路径层级的后缀(比如子目录名),不是文件名的字符串后缀,所以根本没触发删除逻辑,自然删不掉文件。
改法很简单,把Path转成字符串再判断:
if(file.getFileName().toString().endsWith(".rule")) { Files.delete(file); }
第二个坑:没处理删除异常
就算你有管理员权限,如果目标文件正被其他进程占用(比如用编辑器打开着、后台服务在读写),Files.delete()会直接抛出IOException,但你的代码没捕获这个异常,所以你根本不知道哪里出了问题,还以为是代码逻辑有问题。
建议加上异常捕获,打印错误信息,方便排查具体原因:
try { Files.delete(file); System.out.println("搞定!已删除文件: " + file); } catch (IOException e) { System.err.println("删不动啊!文件: " + file + ", 原因: " + e.getMessage()); }
修正后的完整代码
import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; class FileVisitorTest { public static void main(String ... args) throws IOException { Files.walkFileTree(Paths.get("C:\\CMakeFiles"), new SimpleFileVisitor<Path>(){ @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException{ if(file.getFileName().toString().endsWith(".rule")) { try { Files.delete(file); System.out.println("成功删除: " + file); } catch (IOException e) { System.err.println("删除失败: " + file + " - " + e.getMessage()); } } return FileVisitResult.CONTINUE; } }); } }
内容的提问来源于stack exchange,提问作者1m9K
相关产品推荐
相关产品推荐

