У меня есть одна папка, которая содержит много подпапок. Чтобы сделать это более ясным, приведен пример папок:
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. Если у вас есть какие-либо вопросы, спросите пожалуйста !!!
Используя 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)
File#getName()
возвращает строку. Вы используете это, чтобы получить имя текущего файла, а затем попытаетесь переименовать файл, используя File#rename(String)
где метод фактически определен как File#renameTo(File)
. То есть аргумент, как ожидается, будет файлом, в котором вы пытаетесь переименовать файл.
Некоторые предложения:
Посмотрите на Files.move()
чтобы переместить файл в цель - ссылка имеет пример этого
Не используйте метод get name для первого каталога - используйте файл напрямую (что-то вроде ниже, но все же не правильно, я думаю), и это, если вы хотите, чтобы файл находился в том же базовом каталоге movies
i.renameTo(new File(movie," - " + filesInMovie.getName() + ext);
Тем не менее нужна работа для расширения файла ext
однако, который будет поступать из файла i