我有一个包含许多子文件夹的文件夹。为了使其更清楚,这里是文件夹的一个例子:
Movies:
MovieTitle:
Moviefile.mp4 (Movie File)
MovieSubtitles.srt (Subtitles)
MovieSeries:
MovieTitle:
Moviefile.mp4
MovieSubtitles.srt
我需要将每个mp4和srt文件重命名为以下" MovieTitle"。如果电影是系列剧的一部分,则应将其命名为Series" Title + Movie Title"。让我们使用星球大战作为系列和如何命名的例子。 "星球大战"将是" Movies"中的目录名称。在"星球大战"是6个文件夹,每个文件夹中都有一个mp4和srt文件。对于星球大战的第1集,mp4和srt文件应该重命名为:"星球大战 - 第1集第4卷"和#34;星球大战 - 第1集"。如果第1集不是系列剧的一部分,那么它应该被命名为#34; 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 :(得分: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'
为了使用&#34;真实的东西&#34;,将System.out.println()
中的visitFile
替换为Files.move()
,您就完成了!
当然,您也可以选择复制or even create a (hard) link if your filesystem supports it。
旁注:与File
.renameTo()
不同,Files.move()
无法默默失败!
(之后,你应该快速删除Java 6&#39的旧文件API)
答案 1 :(得分:0)
File#getName()
返回一个String。您正在使用它来获取当前文件的名称,然后尝试使用File#rename(String)
重命名该文件,其中该方法实际定义为File#renameTo(File)
。也就是说,参数应该是您尝试重命名文件的文件。
一些建议:
查看Files.move()
使用此方法将文件移至目标 - 链接有此示例
不要对第一个目录使用get name方法 - 直接使用该文件(如下所示,但我认为仍然不正确)这就是你希望文件位于同一个基目录{{1 }}
movies
仍需要扩展文件i.renameTo(new File(movie," - " + filesInMovie.getName() + ext);
的工作,但文件来自文件ext