diff --git a/brut.j.dir/src/main/java/brut/directory/ZipUtils.java b/brut.j.dir/src/main/java/brut/directory/ZipUtils.java index 7898b19d..f1a180d5 100644 --- a/brut.j.dir/src/main/java/brut/directory/ZipUtils.java +++ b/brut.j.dir/src/main/java/brut/directory/ZipUtils.java @@ -54,7 +54,8 @@ public class ZipUtils { throws BrutException, IOException { for (final File file : folder.listFiles()) { if (file.isFile()) { - final ZipEntry zipEntry = new ZipEntry(BrutIO.sanitizeUnknownFile(folder, file.getPath().substring(prefixLength))); + final String normalizedPath = BrutIO.normalizePath(file.getPath().substring(prefixLength)); + final ZipEntry zipEntry = new ZipEntry(BrutIO.sanitizeUnknownFile(folder, normalizedPath)); // aapt binary by default takes in parameters via -0 arsc to list extensions that shouldn't be // compressed. We will replicate that behavior diff --git a/brut.j.util/src/main/java/brut/util/BrutIO.java b/brut.j.util/src/main/java/brut/util/BrutIO.java index e58c7964..20d5b09f 100644 --- a/brut.j.util/src/main/java/brut/util/BrutIO.java +++ b/brut.j.util/src/main/java/brut/util/BrutIO.java @@ -97,6 +97,16 @@ public class BrutIO { return canonicalEntryPath.substring(canonicalDirPath.length()); } + public static String normalizePath(String path) { + char separator = File.separatorChar; + + if (separator != '/') { + return path.replace(separator, '/'); + } + + return path; + } + public static void copy(File inputFile, ZipOutputStream outputFile) throws IOException { try ( FileInputStream fis = new FileInputStream(inputFile)