Java: переименовать файлы — неправильное переименование файлов

Следующий код Java переименовывает файлы, но не переименовывает так, как я хотел. Я хочу, чтобы файлы переименования начинались с начала в каталоге до конца по номерам «части» (а не по времени, когда они были добавлены в определенный каталог), но это не так. Могу ли я поставить проверку «если», например: if filename.contains(j) затем обработать это?

import java.io.File;

public class RenameFile2 {

    public static void main(String[] args) {

        String absolutePath1 = "1 to 4";
        String absolutePath2 = "6 to 9";
        String absolutePath3 = "10 to 99";
        String absolutePath4 = "100 to 224";

        File dir1 = new File(absolutePath1);
        File dir2 = new File(absolutePath2);
        File dir3 = new File(absolutePath3);
        File dir4 = new File(absolutePath4);

        File[] filesInDir1 = dir1.listFiles();
        File[] filesInDir2 = dir2.listFiles();
        File[] filesInDir3 = dir3.listFiles();
        File[] filesInDir4 = dir4.listFiles();

        int i1 = 1;

        for(File file:filesInDir1) {
            String name = file.getName();
            String newName = "550 00510 00" + i1 + ".pdf";
            String newPath = absolutePath1 + "\\" + newName;
            file.renameTo(new File(newPath));
            System.out.println(name + " changed to " + newName);
            i1++;
        }

        int i2 = 6;
        for(File file:filesInDir2) {
            String name = file.getName();
            String newName = "550 00510 00" + i2 + ".pdf";
            String newPath = absolutePath2 + "\\" + newName;
            file.renameTo(new File(newPath));
            System.out.println(name + " changed to " + newName);
            i2++;
        }

        int i3 = 10;
        for(File file:filesInDir3) {
            String name = file.getName();
            String newName = "550 00510 0" + i3 + ".pdf";
            String newPath = absolutePath3 + "\\" + newName;
            file.renameTo(new File(newPath));
            System.out.println(name + " changed to " + newName);
            i3++;
        }

        int i4 = 100;
        //int j = 99;
        for(File file:filesInDir4) {
            String name = file.getName();
/*            if(name.contains(j))
                {
                }
*/
            String newName = "550 00510 " + i4 + ".pdf";
            String newPath = absolutePath4 + "\\" + newName;
            file.renameTo(new File(newPath));
            System.out.println(name + " changed to " + newName);
            i4++;
            }
        }
    }

person Sohel    schedule 23.09.2015    source источник
comment
Во-первых, вы должны извлечь метод для обработки файлов. тогда ответ, вероятно, состоит в том, чтобы использовать некоторую сортировку по filesInDirX, чтобы получить желаемый порядок   -  person    schedule 23.09.2015
comment
1 to 4 (и другие) не является абсолютным путем.   -  person Andreas    schedule 23.09.2015
comment
Проверьте возвращаемое значение renameTo(). Печатайте переименованный только в том случае, если он возвращает true.   -  person Andreas    schedule 23.09.2015
comment
Спасибо за ваши Коментарии. Я решил проблему с Arrays.Sort(), как упомянул RP ниже. Я проверю рекомендации, которые вы дали, чтобы увидеть, можно ли сделать код лучше. Спасибо.   -  person Sohel    schedule 24.09.2015


Ответы (2)


В документации для .listFiles() , там написано:

Нет никакой гарантии, что строки имен в результирующем массиве будут отображаться в каком-либо определенном порядке; в частности, не гарантируется их появление в алфавитном порядке.

Вам нужно отсортировать массив в том порядке, в котором вы хотите обрабатывать их в определенном порядке.


Дополнительные замечания и предложения:

  • String.contains() принимает в качестве аргумента String, а не int. У вас есть этот код, закомментированный в вашем вопросе.
  • Используйте конструктор для File для создания нового пути вместо объединения строк: File newPath = new File(dir1, newName);
person dsh    schedule 23.09.2015
comment
Спасибо дш за ваш отзыв. Я прочитаю об этом больше и постараюсь сделать код лучше. Спасибо. - person Sohel; 24.09.2015

Вам нужно отсортировать файлы после их перечисления, listFiles() не гарантирует никакого порядка.

File[] filesInDir1 = dir1.listFiles();
Arrays.sort(filesInDir1);

Возможно, вам потребуется реализовать Comparator и вызвать Arrays.sort(filesList, comparator), чтобы отсортировать их на заказ.

Как только вы отсортируете файлы, вы можете применить логику переименования по своему усмотрению.

Другим улучшением было бы то, что если вы хотите перечислить только файлы с шаблоном, вы можете фильтровать при перечислении.

final String pattern = "regexpattern";
 dir1.listFiles(new FilenameFilter(){
                           public boolean accept( File dir, String name ) {
                               return name.matches( pattern );
                           }
                        });
person RP-    schedule 23.09.2015
comment
Спасибо, RP, я использовал Arrays.Sort, который решил проблему переименования файлов. Тем не менее, мне нужно улучшить код, так как сортировка, которую я использую, довольно примитивна, а также я изменил источник ввода как числовые значения, а не строки, как это было раньше в имени файла. Я проверю компаратор, о котором вы упомянули, чтобы отсортировать файлы с любым типом имен. Я должен прочитать больше об этом. Спасибо за помощь. - person Sohel; 24.09.2015
comment
Рад, что вы нашли способ решить проблему, если какое-либо из предложенных решений помогло вам в решении, пожалуйста, отметьте это как принятый ответ. - person RP-; 24.09.2015