From 268903ba016b97f61dd61278cec6abffc6f667ff Mon Sep 17 00:00:00 2001 From: Martin Weber Date: Sat, 21 Mar 2020 19:17:22 -0400 Subject: [PATCH] Bug 561318: Recursively delete files without running out of handles Change-Id: Ib760f53a22bb75f0447c633341728a49cdf8cbfb Signed-off-by: Martin Weber --- .../internal/CMakeBuildConfiguration.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java index b695684af21..31e9d3c8a0f 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java @@ -13,8 +13,11 @@ package org.eclipse.cdt.cmake.core.internal; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -318,13 +321,26 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { } } - private void cleanDirectory(Path dir) throws IOException { + /** Recursively removes any files and directories found in the specified Path. + */ + private static void cleanDirectory(Path dir) throws IOException { + SimpleFileVisitor deltor = new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + super.postVisitDirectory(dir, exc); + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }; Path[] files = Files.list(dir).toArray(Path[]::new); for (Path file : files) { - if (Files.isDirectory(file)) - cleanDirectory(file); - else - Files.delete(file); + Files.walkFileTree(file, deltor); } }