重命名文件夹Java中的所有文件

时间:2014-04-01 03:27:42

标签: java file directory

我有一个包含许多子文件夹的文件夹。为了使其更清楚,这里是文件夹的一个例子:

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文件 如果您有任何疑问,请询问!!!

2 个答案:

答案 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)。也就是说,参数应该是您尝试重命名文件的文件。

一些建议:

  1. 查看Files.move()使用此方法将文件移至目标 - 链接有此示例

  2. 不要对第一个目录使用get name方法 - 直接使用该文件(如下所示,但我认为仍然不正确)这就是你希望文件位于同一个基目录{{1 }}

    movies

    仍需要扩展文件i.renameTo(new File(movie," - " + filesInMovie.getName() + ext); 的工作,但文件来自文件ext