Создание zip с несколькими файлами с одинаковым именем - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу сжать несколько файлов из разных мест в одно.

Я сослался https://examples.javacodegeeks.com/core-java/util/zip/create-zip-file-from-multiple-files-with-zipoutputstream/

Вот мой код

publi c class CreateZipFileFromMultipleFilesWithZipOutputStream {

public static void main(String[] args) {

    String zipFile = "C:/archive.zip";

    String[] srcFiles = { "C:/data1/srcfile1.txt", "C:/data2/srcfile2.txt", "C:/data3/srcfile2.txt"};

    try {

        FileOutputStream fos = new FileOutputStream(zipFile);

        ZipOutputStream zos = new ZipOutputStream(fos);

        for (int i=0; i < srcFiles.length; i++) {

            File srcFile = new File(srcFiles[i]);

            ZipEntry zipEntry = new ZipEntry(srcFile.getName());
            zos.putNextEntry(zipEntry);
            zos.write(Files.readAllBytes(srcFile.toPath()));
            zos.closeEntry();
        }

        // close the ZipOutputStream
        zos.close();

    }
    catch (IOException ioe) {
        System.out.println("Error creating zip file: " + ioe);
    }
}

}

При этом возникает исключение: Ошибка создания zip-файла: java .util.zip.ZipException: повторяющаяся запись: dsd c .zip

Есть ли способ проверить, существует ли файл в потоке zip? Так что в таком случае я могу добавить _1 к дубликату имени файла?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

В OpenJDK 8 это обрабатывается закрытым полем "names" в ZipOutputStream, которое не является публично доступным. От вас, очевидно, ожидают, что вы справитесь с этим сами.

Просто используйте HashSet, содержащий имена файлов, которые вы успешно добавили в zip-файл, и проверьте, было ли это имя ранее видно, прежде чем пытаться добавить новый файл. Если это так, измените соответственно.

Тем не менее, вам следует пересмотреть проект решения, если оно может добавить несколько копий одного и того же файла в zip-файл. Либо включите каталоги, чтобы сделать файлы уникальными, либо просто пропустите все, что видели ранее.

0 голосов
/ 22 апреля 2020

Одно из решений:

            Set<String> uniqueFilenames = new HashSet<>();
            for (int i=0; i < srcFiles.length; i++) {

                File srcFile = new File(srcFiles[i]);

                String name = FilenameUtils.getBaseName(srcFile.getName());
                String originalName = name;


                for (int j = 1; !uniqueFilenames.add(name); j++) {
                    name = originalName + "_" + j;
                }

                ZipEntry zipEntry = new ZipEntry(name + "." + FilenameUtils.getExtension(srcFile.getName()));
                zos.putNextEntry(zipEntry);
                zos.write(Files.readAllBytes(srcFile.toPath()));
                zos.closeEntry();

@ Торбьерн Равн также предложил нечто подобное. Но есть ли другой способ?

...