2014-04-01 64 views
1

我有一个包含许多子文件夹的文件夹。为了更清楚这里是一个文件夹的例子:重命名文件夹中的所有文件Java

Movies: MovieTitle: Moviefile.mp4 (Movie File) MovieSubtitles.srt (Subtitles) MovieSeries: MovieTitle: Moviefile.mp4 MovieSubtitles.srt 我需要将每个mp4和srt文件重命名为以下“MovieTitle”。如果电影是一个系列的一部分,它应该被命名为系列“标题+电影标题”。让我们以星球大战为例来说明系列以及如何命名。 “星球大战”将成为“电影”中的一个目录名称。在“星球大战”中有6个文件夹,每个文件夹中都有一个mp4和srt文件。对于星球大战第1集,mp4和srt文件应该重新命名为:“星球大战 - 第1集.mp4”和“星球大战 - 第1集.srt”。如果第1集是不是系列的一部分,它应该被命名为只是“插曲1.mp4”

这里是我想出了到目前为止的代码:我知道renameTo是

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) 
      }    
     } 

    } 
} 

Java中的实际功能。我认为它会重命名文件,直到我看到它实际上做了什么(我仍然有点模糊)。所以我的主要问题是如何获得此代码来正确地重命名文件。

只需要了解一些额外的内容: One Directory包含所有电影。 电影文件夹中有每个文件夹的可能性 它有其他文件夹(它是一个系列) 它有一个mp4和srt文件 如果您有任何问题,请询问!!!

+0

你使用Java 6或Java 7+工作? – fge

+0

@fge我正在使用java 7 – MrSoftee

+0

您是否也在使用番石榴?因为如果你这样做会很容易! – fge

回答

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' 

为了使其使用“动真格”,替换visitFileFiles.move()System.out.println()就大功告成了!

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

备注:不像File.renameTo(),Files.move()不会默默失败!

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

0

File#getName()返回一个字符串。您正在使用它获取当前文件的名称,然后尝试使用File#rename(String)重命名该文件,其中该方法实际上定义为File#renameTo(File)。这是它的参数预计是一个文件,你正试图重命名文件。

几点建议:

  1. Files.move()使用这个文件移动到目标 - 链接具有示例的这一

  2. 不要使用get名称方法的第一个目录 - 使用直接在文件(类似下面,但仍然不能解决我认为)这就是如果你想在相同的基本目录movies

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

    尚需文件ext不过的扩展,将来自该文件i