Fix: 删除实例过程中修改实例设置导致实例目录残留文件 - #6605
Open
hmr-BH wants to merge 1 commit into
Open
Conversation
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


问题:
在任意实例的实例管理页面点击

删除实例->删除、且删除任务未完成时,修改某一项实例配置,会导致版本文件夹中出现该实例的残留配置文件(如图)复现方法:
(最好将用于测试的
.minecraft文件夹放在机械硬盘或者响应速度较慢的老旧SATA固态硬盘中)打开某个实例的实例管理界面,点击
删除实例->删除后迅速点击“版本隔离”的开关(不一定非得是这个,只是比较容易)然后到实例文件夹就可以看到残留的文件和文件夹了。
由于我的电脑性能不算很差,因此窗口期很短,但如果电脑性能较差,那么非常可能因为误触导致文件残留。
修复措施:
删除实例时将实例ID添加到一个即将被删除的实例的名单中,保存游戏设置的时候会检查当前更改配置的实例是否处于这个名单中,如果是,那么就不将配置写入磁盘。
其他问题:
测试的时候发现:


如果电脑配置很差或者系统卡顿的时候,点击
删除实例->删除后在页面没有跳转时,点击修改游戏图标->(随便选一个其他的图标)->确定会引发HMCL崩溃。完整报错信息
---- Hello Minecraft! Crash Report ----
Version: 3.17.SNAPSHOT
Time: 2026-08-04 13:33:22
Thread: Thread[#44,JavaFX Application Thread,5,main]
Content:
org.jackhuang.hmcl.game.NoSuchGameInstanceException: 26.2
at org.jackhuang.hmcl.game.DefaultGameRepository.getResolvedInstanceManifest(DefaultGameRepository.java:284)
at org.jackhuang.hmcl.game.HMCLGameRepository.getInstanceIconImage(HMCLGameRepository.java:665)
at org.jackhuang.hmcl.ui.game.GameSettingsPage.loadIcon(GameSettingsPage.java:2728)
at org.jackhuang.hmcl.ui.instances.GameInstanceIconDialog.onAccept(GameInstanceIconDialog.java:123)
at org.jackhuang.hmcl.ui.construct.DialogPane.lambda$new$0(DialogPane.java:55)
at javafx.base@25/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at javafx.base@25/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:232)
at javafx.base@25/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:189)
at javafx.base@25/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base@25/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.base@25/javafx.event.Event.fireEvent(Event.java:199)
at javafx.graphics@25/javafx.scene.Node.fireEvent(Node.java:9026)
at javafx.controls@25/javafx.scene.control.Button.fire(Button.java:203)
at javafx.controls@25/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:207)
at javafx.controls@25/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at javafx.base@25/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247)
at javafx.base@25/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at javafx.base@25/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:232)
at javafx.base@25/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:189)
at javafx.base@25/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at javafx.base@25/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at javafx.base@25/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at javafx.base@25/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.base@25/javafx.event.Event.fireEvent(Event.java:199)
at javafx.graphics@25/javafx.scene.Scene$MouseHandler.process(Scene.java:4061)
at javafx.graphics@25/javafx.scene.Scene.processMouseEvent(Scene.java:1947)
at javafx.graphics@25/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2784)
at javafx.graphics@25/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.get(GlassViewEventHandler.java:353)
at javafx.graphics@25/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.get(GlassViewEventHandler.java:255)
at javafx.graphics@25/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:424)
at javafx.graphics@25/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
at javafx.graphics@25/com.sun.glass.ui.View.handleMouseEvent(View.java:573)
at javafx.graphics@25/com.sun.glass.ui.View.notifyMouse(View.java:975)
at javafx.graphics@25/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics@25/com.sun.glass.ui.win.WinApplication.lambda$runLoop$0(WinApplication.java:168)
at java.base/java.lang.Thread.run(Thread.java:1474)
-- System Details --
Operating System: Windows 11 25H2 10.0.26200.8875
System Architecture: x86-64
Java Architecture: x86-64
Java Version: 25.0.4, Azul Systems, Inc.
Java VM Version: OpenJDK 64-Bit Server VM (mixed mode, sharing), Azul Systems, Inc.
JVM Max Memory: 1073741824
JVM Total Memory: 110100480
JVM Free Memory: 12749856