我对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 :(得分: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]);
}