【问题标题】:Rename All Files In Folders Java重命名文件夹Java中的所有文件
【发布时间】:2014-04-01 03:27:41
【问题描述】:

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

Movies: MovieTitle: Moviefile.mp4 (Movie File) MovieSubtitles.srt (Subtitles) MovieSeries: MovieTitle: Moviefile.mp4 MovieSubtitles.srt 我需要将每个 mp4 和 srt 文件重命名为以下“MovieTitle”。如果电影是系列的一部分,则应将其命名为系列“标题+电影标题”。让我们以《星球大战》为例说明系列以及如何命名。 “星球大战”将是“电影”中目录的名称。在“星球大战”中有 6 个文件夹,每个文件夹中都有一个 mp4 和 srt 文件。对于星球大战第 1 集,mp4 和 srt 文件应重命名为:“星球大战 - Episode 1.mp4”和“星球大战 - Episode 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文件 有什么问题请追问!!!

【问题讨论】:

  • 您使用 Java 6 还是 Java 7+?
  • @fge 我正在使用 java 7
  • 你也在使用番石榴吗?因为如果你这样做会很容易!
  • @fge 我目前没有使用它。事实上,从未听说过。这是什么?
  • here;这是一个非常强大的库

标签: java file directory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用 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'
    

    为了让它使用“真实的东西”,将visitFile中的System.out.println()替换为Files.move()就完成了!

    当然,你也可以选择复制,or even create a (hard) link if your filesystem supports it

    旁注:与File.renameTo() 不同,Files.move() 不会静默失败!

    (在那之后,你应该快速放弃 Java 6 的旧文件 API)

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 2014-08-03
      • 2016-07-15
      • 1970-01-01
      • 2016-07-04
      • 2013-06-20
      • 2015-10-20
      相关资源
      最近更新 更多