基于对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();
}
}
}
}
知道我错了什么?
答案 0 :(得分:1)
根据javadocs:
重命名文件可能无法移动文件此方法行为的许多方面本质上都依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果文件具有目标抽象路径名已存在。应始终检查返回值以确保重命名操作成功。
请尝试java.nio.file.Files.move()
。
答案 1 :(得分:0)
虽然@nitegazer是正确的,但我应该使用 Files.move()
而不是 File.renameTo()
。事实证明,这不是部分文件树行走的原因。文件树遍历失败,因为过滤器区分大小写,我只提供了文件扩展名的小写版本。
我确实遇到了一个小脚本的问题,我用它来随机填充输入料斗以测试分拣机,但这只是一个测试脚本,可以与 File.renameTo()
一起使用。