From 07cc0aa5fdebe1c006c4119f05d05166b95d8b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 6 Oct 2026 18:49:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=B3=A8=E5=86=8C=E8=A1=A8?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=96=87=E4=BB=B6=E6=94=B9=E7=94=A8=20create?= =?UTF-8?q?=5Fnew=20=E6=89=93=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - registry.rs 的 write_atomically 不再用会跟随符号链接的 File::create,改用 O_EXCL 打开临时文件,已存在的链接/残留文件直接失败 --- .../ai-game-creator-shell/src-tauri/src/export/registry.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs b/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs index 656f22d8b..cbf66fa52 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs @@ -133,7 +133,12 @@ fn write_atomically(path: &Path, text: &str) -> Result<(), RegistryError> { })?; let temp = temp_path(path); let write = || -> std::io::Result<()> { - let mut file = fs::File::create(&temp)?; + // `create_new`(O_EXCL)不跟随已存在的路径:项目里预先摆好的同名符号链接或残留文件会让 + // 这次写入直接失败,而不是把链接指向的文件截断成注册表内容。 + let mut file = fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(&temp)?; file.write_all(text.as_bytes())?; // 替换前落盘:只 flush 的话,崩溃窗口里换过去的可能是还没写完的内容。 file.sync_all()