diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java index b7e21447c3..f1d4b666b8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/instances/SchematicsPage.java @@ -54,6 +54,7 @@ import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; @@ -161,10 +162,25 @@ public void onCreateDirectory() { return; Path parent = currentDirectory.path; + + Set existingFolders; + + try (var list = Files.list(parent)) { + existingFolders = list.map(Path::getFileName) + .map(Path::toString) + .collect(Collectors.toSet()); + } catch (IOException e) { + LOG.warning("Failed to list folders in " + parent, e); + existingFolders = Set.of(); + } + + Set finalExistingFolders = existingFolders; + Controllers.prompt( i18n("schematics.create_directory.prompt"), (result, handler) -> { Path targetDir = parent.resolve(result); + if (Files.exists(targetDir)) { handler.reject(i18n("schematics.create_directory.failed.already_exists")); return; @@ -178,7 +194,7 @@ public void onCreateDirectory() { LOG.warning("Failed to create directory: " + targetDir, e); handler.reject(i18n("schematics.create_directory.failed", targetDir)); } - }, "", new RequiredValidator(), new Validator(i18n("schematics.create_directory.failed.invalid_name"), FileUtils::isNameValid)); + }, "", new RequiredValidator(), new Validator(i18n("schematics.create_directory.failed.invalid_name"), FileUtils::isNameValid), new Validator(i18n("schematics.create_directory.failed.already_exists"), (it) -> !finalExistingFolders.contains(it))); } private DirItem loadAll(Path dir, @Nullable DirItem parent) {