]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils/src/org/simantics/utils/FileUtils.java
Worked around Windows FS problems in IndexedRelationsSearcherBase
[simantics/platform.git] / bundles / org.simantics.utils / src / org / simantics / utils / FileUtils.java
index 6ae209c9ac0cc8c9d0ffaa962d7f11768f693846..44a3dfcf5731b9ff2c9334959a66e3463416f283 100644 (file)
@@ -970,6 +970,20 @@ public class FileUtils {
         deleteWithFilter(path, null);
     }
 
+    /**
+     * Empties the specified directory but does not delete the directory itself.
+     * If a non-directory path is given, it is simply deleted.
+     * 
+     * @param path
+     * @throws IOException
+     */
+    public static void emptyDirectory(Path path) throws IOException {
+        if (Files.isDirectory(path))
+            Files.walkFileTree(path, new EmptyDirectoryVisitor());
+        else
+            Files.deleteIfExists(path);
+    }
+
     public static void copy(Path from, Path to) throws IOException {
         Files.walkFileTree(from, new CopyDirectoriesVisitor(from, to));
     }
@@ -987,12 +1001,7 @@ public class FileUtils {
             if (filter != null && !filter.test(file)) {
                 return FileVisitResult.CONTINUE;
             }
-            if (Files.exists(file)) {
-                Files.delete(file);
-            }
-            if (Files.exists(file)) {
-                throw new IOException("Could not delete file " + file.toAbsolutePath().toString());
-            }
+            Files.deleteIfExists(file);
             return FileVisitResult.CONTINUE;
         }
         
@@ -1003,15 +1012,36 @@ public class FileUtils {
             if (filter != null && !filter.test(dir)) {
                 return FileVisitResult.CONTINUE;
             }
-            if (Files.exists(dir)) {
-                Files.delete(dir);
-            }
-            if (Files.exists(dir))
-                throw new IOException("Could not delete file " + dir.toAbsolutePath().toString());
+            Files.deleteIfExists(dir);
             return FileVisitResult.CONTINUE;
         }
     }
-    
+
+    private static class EmptyDirectoryVisitor extends SimpleFileVisitor<Path> {
+        int depth = 0;
+
+        @Override
+        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+            Files.deleteIfExists(file);
+            return FileVisitResult.CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+            ++depth;
+            return FileVisitResult.CONTINUE;
+        }
+
+        @Override
+        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+            if (exc != null)
+                throw exc;
+            if (--depth > 0)
+                Files.deleteIfExists(dir);
+            return FileVisitResult.CONTINUE;
+        }
+    }
+
     public static class CopyDirectoriesVisitor extends SimpleFileVisitor<Path> {
         
         private final Path fromPath;