2014-04-01 85 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