From: Tuukka Lehtonen Date: Fri, 8 Jun 2018 22:24:40 +0000 (+0300) Subject: Worked around Windows FS problems in IndexedRelationsSearcherBase X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=commitdiff_plain;h=refs%2Fheads%2Frelease%2F1.32.0.1;p=simantics%2Fplatform.git Worked around Windows FS problems in IndexedRelationsSearcherBase See https://blogs.msdn.microsoft.com/oldnewthing/20120907-00/?p=6663/ gitlab #19 Change-Id: I0bdcdc4945bde80446da20f18f7e471af0a97c07 --- diff --git a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java index abd6e1ba5..39ff02199 100644 --- a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java +++ b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/DatabaseIndexing.java @@ -14,6 +14,8 @@ package org.simantics.db.indexing; import java.io.File; import java.io.FileFilter; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import org.simantics.db.Resource; @@ -194,8 +196,9 @@ public final class DatabaseIndexing { // Make sure that index-base is a valid directory if (DEBUG) System.out.println(indexBase + " is not a directory! Removing it."); - FileUtils.deleteAll(indexBase); - indexBase.mkdirs(); + Path base = indexBase.toPath(); + FileUtils.emptyDirectory(base); + Files.createDirectories(base); return; } File allDirtyFile = getAllDirtyFile(); diff --git a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsSearcherBase.java b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsSearcherBase.java index 056a05e8a..387b2b509 100644 --- a/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsSearcherBase.java +++ b/bundles/org.simantics.db.indexing/src/org/simantics/db/indexing/IndexedRelationsSearcherBase.java @@ -612,7 +612,7 @@ abstract public class IndexedRelationsSearcherBase { if (overwrite) { mon.subTask("Erasing previous index"); - FileUtils.deleteAll(indexPath); + FileUtils.emptyDirectory(indexPath.toPath()); } final AtomicReference directory = new AtomicReference(); diff --git a/bundles/org.simantics.utils/src/org/simantics/utils/FileUtils.java b/bundles/org.simantics.utils/src/org/simantics/utils/FileUtils.java index 798fd02b8..71fb9ac2c 100644 --- a/bundles/org.simantics.utils/src/org/simantics/utils/FileUtils.java +++ b/bundles/org.simantics.utils/src/org/simantics/utils/FileUtils.java @@ -959,21 +959,34 @@ public class FileUtils { return read; } - public static void delete(Path databaseLocation) throws IOException { - Files.walkFileTree(databaseLocation, new DeleteDirectoriesVisitor()); + public static void delete(Path path) throws IOException { + if (Files.exists(path)) + Files.walkFileTree(path, new DeleteDirectoriesVisitor()); } - + + /** + * 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)); } - + public static class DeleteDirectoriesVisitor extends SimpleFileVisitor { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - if (Files.exists(file)) - throw new IOException("Could not delete file " + file.toAbsolutePath().toString()); + Files.deleteIfExists(file); return FileVisitResult.CONTINUE; } @@ -981,13 +994,36 @@ public class FileUtils { public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { if (exc != null) throw exc; - 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 { + 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 { private final Path fromPath;