Переименовать все файлы в папках Java

1

У меня есть одна папка, которая содержит много подпапок. Чтобы сделать это более ясным, приведен пример папок:

Movies: MovieTitle: Moviefile.mp4 (Movie File) MovieSubtitles.srt(Subtitles) MovieSeries: MovieTitle: Moviefile.mp4 MovieSubtitles.srt Мне нужно переименовать каждый файл mp4 и srt в следующий "MovieTitle". Если фильм является частью серии, его следует назвать серией "Title + Movie Title". Позволяет использовать Звездные войны в качестве примера для серии и как назвать. "Звездные войны" будут названием каталога в "Кино". В "Звездных войнах" есть 6 папок с файлом mp4 и srt. Для эпизода 1 звездных войн файл mp4 и srt следует переименовать в "Звездные войны - Эпизод 1.mp4" и "Звездные войны - Эпизод 1.srt". Если эпизод 1 не был частью серии, его следует назвать просто "Episode 1.mp4",

Вот код, который я придумал до сих пор:

    public static void renaming(File[] files){
    String dir1, dir2;
    for(File movie: files){ //Main folder containing all of the movies.
        dir1 = movie.getName();
        for(File filesInMovie: movie.listFiles()){
            if(filesInMovie.isDirectory()){ //This means that it is a series.
                dir2 = filesInMovie.getName();
                for(File i: filesInMovie.listFiles()){
                    i.renameTo(dir1 + " - " + dir2);
                }
            }else{
                filesInMovie.renameTo(dir1)
            }               
        }

    }
}

Я понимаю, что renameTo является фактической функцией в Java. Я думал, что он переименует файлы, пока я не прочитаю, что он на самом деле делает (что я все еще немного нечеткое). Поэтому мой главный вопрос заключается в том, как заставить этот код правильно переименовывать файлы.

Просто некоторые дополнительные вещи, которые вы должны знать: Один каталог Содержит все фильмы. Есть возможности для каждой папки в папке фильмов. В ней есть другие папки (это серия). В ней есть файл mp4 и srt. Если у вас есть какие-либо вопросы, спросите пожалуйста !!!

  • 0
    Вы используете Java 6 или Java 7+?
  • 0
    @fge Я использую Java 7
Показать ещё 3 комментария
Теги:
directory
file
folder

2 ответа

0

Используя Guava и Java 7, вот что вы можете сделать:

public final class Renamer
{
    private static final Joiner JOINER = Joiner.on(" - ");

    private static final class RenamerVisitor
        extends SimpleFileVisitor<Path>
    {
        private final Path baseDir;

        private RenamerVisitor(final Path baseDir)
        {
            this.baseDir = baseDir;
        }

        @Override
        public FileVisitResult visitFile(final Path file,
            final BasicFileAttributes attrs)
            throws IOException
        {
            final Path relpath = baseDir.relativize(file);
            final String targetName
                = JOINER.join(Iterables.transform(relpath,
                Functions.toStringFunction()));
            final Path dstPath = baseDir.resolve(targetName);
            System.out.printf("'%s' -> '%s'\n", file, dstPath);
            return FileVisitResult.CONTINUE;
        }
    }

    public static void main(final String... args)
        throws IOException
    {
        final Path baseDir = Paths.get("/home/fge/tmp/jsr203/docs");
        Files.walkFileTree(baseDir, new RenamerVisitor(baseDir));
    }
}

Это для моей среды в каталоге. Пример вывода:

[...]
'/home/fge/tmp/jsr203/docs/java/io/class-use/File.html' -> '/home/fge/tmp/jsr203/docs/java - io - class-use - File.html'
'/home/fge/tmp/jsr203/docs/java/io/class-use/FilePermission.html' -> '/home/fge/tmp/jsr203/docs/java - io - class-use - FilePermission.html'
'/home/fge/tmp/jsr203/docs/java/io/File.html' -> '/home/fge/tmp/jsr203/docs/java - io - File.html'

Чтобы заставить его использовать "реальную вещь", замените System.out.println() в visitFile с Files.move() и все готово!

Конечно, вы также можете выбрать для копирования или даже создать (жесткую) ссылку, если ваша файловая система поддерживает ее.

Боковое примечание: в отличие от File .renameTo(), Files.move() не Files.move() молча!

(и после этого вы должны быстро отбросить Java файл Java 6)

0

File#getName() возвращает строку. Вы используете это, чтобы получить имя текущего файла, а затем попытаетесь переименовать файл, используя File#rename(String) где метод фактически определен как File#renameTo(File). То есть аргумент, как ожидается, будет файлом, в котором вы пытаетесь переименовать файл.

Некоторые предложения:

  1. Посмотрите на Files.move() чтобы переместить файл в цель - ссылка имеет пример этого

  2. Не используйте метод get name для первого каталога - используйте файл напрямую (что-то вроде ниже, но все же не правильно, я думаю), и это, если вы хотите, чтобы файл находился в том же базовом каталоге movies

    i.renameTo(new File(movie," - " + filesInMovie.getName() + ext);
    

    Тем не менее нужна работа для расширения файла ext однако, который будет поступать из файла i

Ещё вопросы

Сообщество Overcoder
Наверх
Меню