Fix extraction failure on long paths (>260 chars) with \?\ prefix
Build and Release / build (push) Has been cancelled

Add longPathForWindows() helper that prefixes extract target directories
with \?\ on Windows, bypassing the 260-char MAX_PATH limit. Applied to
both WinRAR/UnRAR and 7z arguments. Fixes "Die Syntax für den
Dateinamen, Verzeichnisnamen" errors when archive internal directories
create deeply nested output paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Sucukdeluxe
2026-03-02 20:24:55 +01:00
co-authored by Claude Opus 4.6
parent a22a90adf3
commit 2ae22f942e
3 changed files with 24 additions and 6 deletions
+5 -3
View File
@@ -20,14 +20,15 @@ describe("extractor", () => {
expect(overwriteArgs).toContain("-idc");
expect(overwriteArgs.some((value) => /^-mt\d+$/i.test(value))).toBe(true);
expect(overwriteArgs[overwriteArgs.length - 2]).toBe("archive.rar");
expect(overwriteArgs[overwriteArgs.length - 1]).toBe("C:\\target\\");
const winrarTarget = process.platform === "win32" ? "\\\\?\\C:\\target\\" : "C:\\target\\";
expect(overwriteArgs[overwriteArgs.length - 1]).toBe(winrarTarget);
const askArgs = buildExternalExtractArgs("WinRAR.exe", "archive.rar", "C:\\target", "ask", "serienfans.org");
expect(askArgs.slice(0, 4)).toEqual(["x", "-o-", "-pserienfans.org", "-y"]);
expect(askArgs).toContain("-idc");
expect(askArgs.some((value) => /^-mt\d+$/i.test(value))).toBe(true);
expect(askArgs[askArgs.length - 2]).toBe("archive.rar");
expect(askArgs[askArgs.length - 1]).toBe("C:\\target\\");
expect(askArgs[askArgs.length - 1]).toBe(winrarTarget);
const compatibilityArgs = buildExternalExtractArgs("WinRAR.exe", "archive.rar", "C:\\target", "overwrite", "", false);
expect(compatibilityArgs).not.toContain("-idc");
@@ -455,7 +456,8 @@ describe("extractor", () => {
expect(args7z).toContain("-aoa");
expect(args7z).toContain("-p");
expect(args7z).toContain("archive.7z");
expect(args7z).toContain("-oC:\\target");
const sevenZTarget = process.platform === "win32" ? "-o\\\\?\\C:\\target" : "-oC:\\target";
expect(args7z).toContain(sevenZTarget);
});
it("builds 7z args with skip conflict mode", () => {