Переименование дубликатов файлов в zip-файле Java

У меня есть несколько файлов, включая дубликаты, которые я должен сжать в архив. Знаете ли вы какой-нибудь инструмент, способный переименовывать дубликаты файлов перед созданием архива ex(cat.txt, cat(1).txt, cat(2).txt ...)?

3 ответа

Я создал следующий код, который легко удаляет дубликаты:

static void renameDuplicates(String fileName, String[] newName) {
    int i=1;
    File file = new File(fileName + "(1).txt");
    while (file.exists() && !file.isDirectory()) {
        file.renameTo(new File(newName[i-1] + ".txt"));
        i++;
        file = new File(fileName + "(" + i + ").txt");
    }
}

Использовать просто так:

String[] newName = {"Meow", "MeowAgain", "OneMoreMeow", "Meowwww"};
renameDuplocates("cat", newName);

Результат:

cat.txt     ->    cat.txt
cat(1).txt  ->    Meow.txt
cat(2).txt   ->   MeowAgain.txt
cat(3).txt   ->   OneMoreMeow.txt

Имейте в виду, что количество дубликатов должно быть меньше или равно альтернативным именам в указанном массиве строк. Вы можете предотвратить это с помощью модификации цикла:

while (file.exists() && !file.isDirectory() && i<=newName.length)

В этом случае оставшиеся файлы останутся безымянными.

Попробуйте такой подход:

File folder = new File("your/path");
HashMap<String,Integer> fileMap = new HashMap<String,Integer>();
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
    if(fileMap.containsKey(listOfFiles[i])){
             String newName = listOfFiles[i]+"_"
                +fileMap.get(listOfFiles[i]);
             fileMap.put(listOfFiles[i],fileMap.get(listOfFiles[i])+1);
             listOfFiles[i].renameTo(newName);
             fileMap.put(newName,1); // can be ommitted
    }else{
            fileMap.put(listOfFiles[i],1);
    }
}

Добавьте статическое поле в некоторый класс с некоторым начальным значением.

static int number = 1;

Затем в своем коде Java вы можете переименовать дубликаты таким образом, используя потоки Java 8 и класс Files:

Set<String> files = new HashSet<String>();

    youCollectionOfFiles.stream().forEach((file)->{
        if (files.add(file.getFileName().toString()) == false) {
            try {
                //rename the file
                Files.move(file, 
                        file.resolveSibling(file.getFileName().toString() + (number++)));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    });;
Другие вопросы по тегам