2016-08-30 7 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; 
} 

基本的には、元のディレクトリ変数内のディレクトリとサブディレクトリのすべてを通過し、ArrayListを(songsToAdd)にすべて.MP3と.wavファイルを追加します。このメソッドは、アクションリスナーによって

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

それはのようなgetName().contains(...)に、その後、他のdirectoryであれば、私はaddSongList方法、最初のチェックにお勧めします:

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

関連する問題