递归地将文件从一个目录移动到另一个目录仅部分完成

时间:2013-05-25 17:16:41

标签: java fileutils java.nio.file

基于对List all files from a directory recursively with Java

的回答

我编写了一个小文件,它将递归移动目录中的每个文件并将它们放在另一个目录的顶层。但由于某种原因,代码不会移动所有文件。我切换到使用Files.move(),但绝对值得,而代码仍然没有正确地走在目录树。现在我在尝试移动文件时遇到 java.nio.file.NoSuchFileException

堆栈跟踪说它是一个未知来源,但是当我查看文件是否存在时,它就是。我已将问题隔离到 Files.move(),但我似乎无法修复它。我尝试了 getPath() getAbsolutePath()。什么甚至更奇怪我在我的排序例程中使用类似的方法,它工作正常。唯一的区别是我的源目录没有子目录。

我已经解决了部分树步行问题。这是因为我的ImageFilter只有小写扩展,并且过滤器需要区分大小写。所以我在这里修好了。

好的,我将我的小Filemover切换回 file.renameTo(),现在它正常工作。它只是一个测试工具,用于将文件随机移动到我的图像分类器的放置目录中,所以不值得弄清楚为什么我得到没有这样的文件异常。我只是修改它以递归方式工作,所以如果有人在一堆图像上使用错误的排序例程,它可以用来反转排序。

感谢您的帮助:)

我有3个班级

 import java.io.File;
import java.util.Collection;
import org.apache.commons.io.FileUtils;



import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;

import ca.fotonow.p3software.ImageFileFilter;

public class PSFileUtils {
    public static Collection<File> listfiles(String directory) {

        // TODO Auto-generated method stub
        File dir= new File (directory);
        dir.mkdirs(); //create directory if it doesn't exist.
        Collection<File> files= FileUtils.listFiles(dir,new ImageFileFilter(),DirectoryFileFilter.DIRECTORY);


        return files;
    }
   }

过滤类

import java.io.File;
import java.io.FileFilter;

import org.apache.commons.io.filefilter.IOFileFilter;

public class ImageFileFilter implements IOFileFilter {
    private final String filetypes[]= new String[] {"jpeg", "JPEG","jpg","JPG","tif","TIF","tiff","TIFF","raw","RAW"}; 
    @Override
    public boolean accept(File file) {
        for (String ext: filetypes) {
            if (file.getName().toLowerCase().endsWith(ext)) return true;
        }
        return false;
    }
    @Override
    public boolean accept(File arg0, String arg1) {
        // TODO Auto-generated method stub
        return false;
    }

}

主要课程

import java.io.File;
import java.util.Collection;
import java.util.Date;
import java.util.Random;
import java.nio.file.Files;
import static java.nio.file.StandardCopyOption.*;

public class FileMover {

    /**
     * @param args
     */
    public static void main(String[] args) {
    //Move random number of files from one directory args[0] to another directory args[1]
    //directories can be relative
    //Repeats randomly until files are gone

    String dir1=args[0];
    String dir2=args[1];



    Collection<File> files=PSFileUtils.listfiles(dir1);

    for (File file: files) {

        File newfile=new File(dir2+"/"+file.getName());

        try {
        Files.move(file.toPath(),newfile.toPath(), REPLACE_EXISTING);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
        System.out.println((new Date()).getTime()+ " "+ newfile.getName());

        Random generator =new Random(new Date().getTime());
        try {
            Thread.sleep(generator.nextInt(5000));
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}

知道我错了什么?

2 个答案:

答案 0 :(得分:1)

根据javadocs:

重命名文件可能无法移动文件
  

此方法行为的许多方面本质上都依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果文件具有目标抽象路径名已存在。应始终检查返回值以确保重命名操作成功。

请尝试java.nio.file.Files.move()

答案 1 :(得分:0)

虽然@nitegazer是正确的,但我应该使用 Files.move() 而不是 File.renameTo() 。事实证明,这不是部分文件树行走的原因。文件树遍历失败,因为过滤器区分大小写,我只提供了文件扩展名的小写版本。

我确实遇到了一个小脚本的问题,我用它来随机填充输入料斗以测试分拣机,但这只是一个测试脚本,可以与 File.renameTo() 一起使用。