2016-08-30 30 views
0

我很新的遞歸和Java文件操作,我想編寫一個程序來複制所有一類的文件中。目錄及其所有子目錄到該程序所在的目錄不過,我不斷收到一個IOException:因爲它正由另一個進程使用 進程無法訪問文件。 我的遞歸代碼如下:從一個目錄複製一個類型的所有文件拋出錯誤使用一個文件遞歸

private ArrayList<File> addSongList(String dir) { 
    ArrayList<File> songsToAdd = new ArrayList<File>(); 

    File currentFolder = new File(dir); 
    File[] files = currentFolder.listFiles(); 

    for (int i = 0; i < files.length; i++) 
     if (files[i].getName().contains(".mp3") || files[i].getName().contains(".wma")) 
      songsToAdd.add(files[i]); 
     else if (files[i].isDirectory()) 
      songsToAdd.addAll(addSongList(dir + "/" + files[i].getName())); 

    return songsToAdd; 
} 

基本上不用通過所有原dir變量的目錄和子目錄,並增加了所有.MP3和.wav文件到一個ArrayList(songsToAdd)。此方法在此稱爲:

  ArrayList<File> Songs = addSongList(dir); 
      String finalPath = new File("").getAbsolutePath(); 
      for(int i = 0; i < Songs.size(); i++){ 
       try { 
        Files.copy(Songs.get(i).toPath(), new File(finalPath).toPath(), StandardCopyOption.REPLACE_EXISTING); 
        System.out.println("Copied " + Songs.get(i).getName() + " to " + finalPath); 
       } catch (IOException arg0) { 
        // TODO Auto-generated catch block 
        arg0.printStackTrace(); 
       } 
      } 
      System.out.println("Copy Complete!"); 

由動作監聽器。我無法弄清楚爲什麼它會拋出這個錯誤。

回答

0

您需要包括歌曲的名稱在目標路徑複製象下面這樣:

ArrayList<File> Songs = addSongList(dir); 

for(int i = 0; i < Songs.size(); i++){ 
    try { 
     Path sourcePath = Songs.get(i).toPath(); 
     Path targetPath = Paths.get(Songs.get(i).getName()).toAbsolutePath(); 

     Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); 
     System.out.println("Copied " + Songs.get(i).getName() + " to " + targetPath.toString()); 
     } catch (IOException arg0) { 
       // TODO Auto-generated catch block 
       arg0.printStackTrace(); 
      } 
} 
System.out.println("Copy Complete!"); 

如果你看一下Files.copy的文檔,它說Copy a file to a target file.因此,你需要指定哪些文件?如果需要,您也可以爲複製的文件選擇不同的名稱。像Path targetPath = Paths.get("Copied_" + Songs.get(i).getName()).toAbsolutePath()

同樣在一個側面說明,我將在addSongList方法,首先檢查表明,如果它是一個directory然後別的getName().contains(...),如:

if (fileNames[i].isDirectory()) 
{ 
    songsToAdd.addAll(addSongList(dir + "/" + files[i].getName())); 
} 
else if (files[i].getName().contains(".mp3") || files[i].getName().contains(".wma")) 
{ 
    songsToAdd.add(files[i]); 
} 
+0

太謝謝你了!這很好用! – Ranger645

相關問題