From 8f14ecb5a1489249317e6173ef857bb5501a1019 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 28 May 2026 13:37:21 +0200 Subject: [PATCH] Fix nested directory entries: add full ancestor chain to ZIP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously only the immediate parent directory was added as a ZIP entry. For deeply nested paths like NAS50TH/TRACKS/WILKES/WILKES.DAT, only NAS50TH/TRACKS/WILKES/ was created — but NAS50TH/TRACKS/ and NAS50TH/ were skipped (they're only parents of other directories, never the immediate parent of a file). Emscripten's FS.createDirectory() fails if parent doesn't exist, so intermediate directories must be in the ZIP too. Now walks up the full ancestor chain with a while loop. --- src/main/java/com/dostalgia/UploadResource.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/dostalgia/UploadResource.java b/src/main/java/com/dostalgia/UploadResource.java index 1e5c8c9..b1d569b 100644 --- a/src/main/java/com/dostalgia/UploadResource.java +++ b/src/main/java/com/dostalgia/UploadResource.java @@ -293,15 +293,16 @@ public class UploadResource { Files.walk(extractDir).filter(Files::isRegularFile).forEach(f -> { try { String entryName = extractDir.relativize(f).toString().replace('\\', '/'); - // Ensure all parent directories have explicit entries - // (js-dos Emscripten FS requires explicit directory entries) + // Ensure ALL ancestor directories have explicit entries + // (Emscripten FS requires every directory in the chain) int idx = entryName.lastIndexOf('/'); - if (idx >= 0) { + while (idx >= 0) { String parent = entryName.substring(0, idx + 1); if (addedDirs.add(parent)) { zos.putNextEntry(new java.util.zip.ZipEntry(parent)); zos.closeEntry(); } + idx = entryName.lastIndexOf('/', idx - 1); } zos.putNextEntry(new java.util.zip.ZipEntry(entryName)); Files.copy(f, zos);