从目录复制一种类型的所有文件会使用Recursion抛出正在使用的文件错误

时间:2016-08-30 14:14:19

标签: java file recursion copy

我对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!");

由动作监听器。我无法弄清楚它为什么会抛出这个错误。

1 个答案:

答案 0 :(得分: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]);
}