2016-02-09 3 views
0

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

+0

Вы уверены, что это Java вопрос? – shmosel

+0

Почему бы и нет? Он добавил Java-тег, поэтому он хочет сделать это на Java, поэтому мы даем ему Java-код. –

ответ

0

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

static int number = 1; 

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

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(); 
      } 
     } 

    });; 
1

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

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) 

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

+0

Спасибо, но я подумал, что для меня есть библиотека, которая делает это. –

+0

Я не знаю. В любом случае использование небольшого фрагмента кода до 10 строк также должно быть прекрасным. –

0

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

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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^