From 3f4364c67c8cb944289c8b63e2301bfffea559ba Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sun, 24 Mar 2019 12:14:13 +0800 Subject: [PATCH] Fix cannot launch a game multiple times --- .../org/jackhuang/hmcl/launch/DefaultLauncher.java | 4 ++-- .../java/org/jackhuang/hmcl/util/io/FileUtils.java | 9 +++++++++ .../java/org/jackhuang/hmcl/util/io/Unzipper.java | 12 +++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index cc831dd8e..3913d94fb 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -217,7 +217,7 @@ public class DefaultLauncher extends Launcher { public void decompressNatives(File destination) throws NotDecompressingNativesException { try { - FileUtils.cleanDirectory(destination); + FileUtils.cleanDirectoryQuietly(destination); for (Library library : version.getLibraries()) if (library.isNative()) new Unzipper(repository.getLibraryFile(version, library), destination) @@ -229,7 +229,7 @@ public class DefaultLauncher extends Launcher { return false; return library.getExtract().shouldExtract(path); }) - .setReplaceExistentFile(true).unzip(); + .setReplaceExistentFile(false).unzip(); } catch (IOException e) { throw new NotDecompressingNativesException(e); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java index a38e53f2f..23d6138ec 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/FileUtils.java @@ -277,6 +277,15 @@ public final class FileUtils { throw exception; } + public static boolean cleanDirectoryQuietly(File directory) { + try { + cleanDirectory(directory); + return true; + } catch (IOException e) { + return false; + } + } + public static void forceDelete(File file) throws IOException { if (file.isDirectory()) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java index 6c138b792..dd746d87e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java @@ -117,8 +117,12 @@ public class Unzipper { Path destFile = dest.resolve(relativePath); if (filter != null && !filter.accept(file, false, destFile, relativePath)) return FileVisitResult.CONTINUE; - if (replaceExistentFile || Files.notExists(destFile)) - Files.copy(file, destFile, StandardCopyOption.REPLACE_EXISTING); + try { + Files.copy(file, destFile, replaceExistentFile ? new CopyOption[]{StandardCopyOption.REPLACE_EXISTING} : new CopyOption[]{}); + } catch (FileAlreadyExistsException e) { + if (replaceExistentFile) + throw e; + } return FileVisitResult.CONTINUE; } @@ -129,9 +133,7 @@ public class Unzipper { Path dirToCreate = dest.resolve(relativePath); if (filter != null && !filter.accept(dir, true, dirToCreate, relativePath)) return FileVisitResult.SKIP_SUBTREE; - if (Files.notExists(dirToCreate)) { - Files.createDirectory(dirToCreate); - } + Files.createDirectories(dirToCreate); return FileVisitResult.CONTINUE; } });