From dff20f56a59fd46011fd80daa9239be7162e57d5 Mon Sep 17 00:00:00 2001 From: "mikael.lantz" Date: Tue, 13 Apr 2021 12:53:41 +0200 Subject: [PATCH] fix: Files added to the temp directory gets an index to make them unique Unzipped files are added to a subdirectory named after the zip file to avoid name clashes. --- .../java/se/lantz/gamebase/GamebaseImporter.java | 8 ++++++-- src/main/java/se/lantz/util/FileManager.java | 14 +++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/se/lantz/gamebase/GamebaseImporter.java b/src/main/java/se/lantz/gamebase/GamebaseImporter.java index 5ec752d..faf4d91 100644 --- a/src/main/java/se/lantz/gamebase/GamebaseImporter.java +++ b/src/main/java/se/lantz/gamebase/GamebaseImporter.java @@ -42,6 +42,7 @@ public class GamebaseImporter private String joyBase = ":JU,JD,JL,JR,JF,JF,SP,EN,,F1,F3,F5,,,"; private List gbGameInfoList = new ArrayList<>(); + private int importIndexForTempFiles = 0; private Options selectedOption = Options.FAVORITES; private String titleQueryString = ""; @@ -555,16 +556,18 @@ public class GamebaseImporter } File gameFile = gbPath.resolve(filenameInGb).toFile(); + //Increase index to be sure file names are unique in the temp folder + importIndexForTempFiles++; if (isVic20cart) { return FileManager - .getTempFileForVic20Cart(new BufferedInputStream(new FileInputStream(gameFile)), gameFile.getName()).toPath() + .getTempFileForVic20Cart(new BufferedInputStream(new FileInputStream(gameFile)), importIndexForTempFiles + "_" + gameFile.getName()).toPath() .toString(); } else { File selectedFile = FileManager.createTempFileForScraper(new BufferedInputStream(new FileInputStream(gameFile)), - gameFile.getName()); + importIndexForTempFiles + "_" + gameFile.getName()); //Do not compress prg files: Vice doesn't seem to unzip them properly String lowercaseName = selectedFile.getName().toLowerCase(); if (lowercaseName.endsWith(".gz") || lowercaseName.endsWith(".prg") || lowercaseName.endsWith(".p00") ) @@ -584,5 +587,6 @@ public class GamebaseImporter { gbGameInfoList.clear(); FileManager.deleteTempFolder(); + importIndexForTempFiles = 0; } } diff --git a/src/main/java/se/lantz/util/FileManager.java b/src/main/java/se/lantz/util/FileManager.java index 1e8d573..5925da6 100644 --- a/src/main/java/se/lantz/util/FileManager.java +++ b/src/main/java/se/lantz/util/FileManager.java @@ -34,6 +34,7 @@ import java.util.zip.ZipEntry; import javax.imageio.ImageIO; import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; +import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1131,6 +1132,8 @@ public class FileManager public static File unzipAndPickFirstEntry(File file) { + String unzippedBasePath = TEMP_PATH + File.separator + FilenameUtils.removeExtension(file.getName()) + File.separator; + String zipFilePath = file.getAbsolutePath(); Path filePath = null; FileInputStream fis; @@ -1144,9 +1147,9 @@ public class FileManager if (ze != null) { String fileName = ze.getName(); - File newFile = new File(TEMP_PATH + File.separator + fileName); + File newFile = new File(unzippedBasePath + fileName); //create directories for sub directories in zip - new File(newFile.getParent()).mkdirs(); + new File(newFile.getParentFile().getParent()).mkdirs(); FileOutputStream fos = new FileOutputStream(newFile); int len; while ((len = zis.read(buffer)) > 0) @@ -1170,6 +1173,7 @@ public class FileManager public static File unrarAndPickFirstEntry(File file) { + String unzippedBasePath = TEMP_PATH + File.separator + FilenameUtils.removeExtension(file.getName()) + File.separator; Path filePath = null; try (Archive archive = new Archive(file)) { @@ -1177,7 +1181,11 @@ public class FileManager FileHeader fh = archive.nextFileHeader(); if (fh != null) { - File fileEntry = new File(TEMP_PATH + File.separator + fh.getFileNameString().trim()); + File fileEntry = new File(unzippedBasePath + fh.getFileNameString().trim()); + //create directories for sub directories in rar + new File(fileEntry.getParentFile().getParent()).mkdirs(); + + FileOutputStream os = new FileOutputStream(fileEntry); archive.extractFile(fh, os); os.close();