1

基于对以下问题的回答:List all files from a directory recursive with Java

我写了一个小 Filemover,它将递归地从一个目录中移动每个文件并将它们放在另一个目录的顶层。但由于某种原因,代码不会移动所有文件。我切换到使用 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();
        }
    }
}

}

知道我有什么问题吗?

4

2 回答 2

1

根据 javadocs,重命名文件可能不会移动文件:

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

试试java.nio.file.Files.move()吧。

于 2013-05-25T17:26:31.167 回答
0

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

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

于 2013-05-26T01:21:39.497 回答