From cc1be895754b1533117b7fb5c4dd68ebf10d5472 Mon Sep 17 00:00:00 2001 From: lleplat Date: Fri, 8 Aug 2025 10:42:11 +0100 Subject: [PATCH 1/2] More robust move to trash method --- .../core/tools/FileTools.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/extensionmanager/src/main/java/qupath/ext/extensionmanager/core/tools/FileTools.java b/extensionmanager/src/main/java/qupath/ext/extensionmanager/core/tools/FileTools.java index adf218c..e843c4d 100644 --- a/extensionmanager/src/main/java/qupath/ext/extensionmanager/core/tools/FileTools.java +++ b/extensionmanager/src/main/java/qupath/ext/extensionmanager/core/tools/FileTools.java @@ -3,6 +3,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.swing.SwingUtilities; import java.awt.Desktop; import java.io.File; import java.io.IOException; @@ -70,7 +71,7 @@ public static void moveDirectoryToTrashOrDeleteRecursively(File directoryToDelet Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; if (desktop != null && desktop.isSupported(Desktop.Action.MOVE_TO_TRASH)) { logger.debug("Attempting to move {} to trash", directoryToDelete); - if (!desktop.moveToTrash(directoryToDelete)) { + if (!moveToTrash(desktop, directoryToDelete)) { logger.debug("Failed to move {} to trash. Deleting it", directoryToDelete); deleteDirectoryRecursively(directoryToDelete); } @@ -127,6 +128,25 @@ public static boolean isFileParentOfAnotherFile(File possibleParent, File possib return false; } + private static boolean moveToTrash(Desktop desktop, File fileToDelete) { + if (SwingUtilities.isEventDispatchThread() || !isWindows()) { + // It seems safe to call move to trash from any thread on macOS and Linux + // We can't use the EDT on macOS because of https://bugs.openjdk.org/browse/JDK-8087465 + return desktop.moveToTrash(fileToDelete); + } else { + // EXCEPTION_ACCESS_VIOLATION associated with moveToTrash reported on Windows 11. + // https://github.com/qupath/qupath/issues/1738 + // Could not be replicated (but we didn't have Windows 11...); taking a guess that this might help. + try { + SwingUtilities.invokeAndWait(() -> moveToTrash(desktop, fileToDelete)); + } catch (Exception e) { + logger.warn("Cannot move file {} to trash", fileToDelete, e); + return false; + } + return !fileToDelete.exists(); + } + } + private static void deleteDirectoryRecursively(File directoryToBeDeleted) throws IOException { logger.debug("Deleting children of {}", directoryToBeDeleted); File[] childFiles = directoryToBeDeleted.listFiles(); @@ -139,4 +159,8 @@ private static void deleteDirectoryRecursively(File directoryToBeDeleted) throws logger.debug("Deleting {}", directoryToBeDeleted); Files.deleteIfExists(directoryToBeDeleted.toPath()); } + + private static boolean isWindows() { + return System.getProperty("os.name").toLowerCase().contains("win"); + } } From 071e6b6031960d3be37856ce93ca832f48223a6c Mon Sep 17 00:00:00 2001 From: lleplat Date: Fri, 8 Aug 2025 10:57:07 +0100 Subject: [PATCH 2/2] Bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 86774ad..4098653 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1 +1 @@ -version = "1.0.1" +version = "1.0.2"