Java 如何将文件移动到非空目录?

Java 如何将文件移动到非空目录?,java,nio,Java,Nio,我不熟悉Java的nio包,不知道如何将文件从一个目录转换到另一个目录。我的程序应该读取一个目录及其子目录,并根据特定条件处理文件。我可以使用files.walkFileTree获取所有文件,但当我尝试移动它们时,会得到一个java.nio.file.AccessDeniedException 如果我试图复制它们,就会得到DirectoryNotEmptyException。我在谷歌上找不到任何帮助。我肯定有一种简单的方法可以将文件从一个目录移动到另一个目录,但我想不出来 这就是我试图得到Dir

我不熟悉Java的nio包,不知道如何将文件从一个目录转换到另一个目录。我的程序应该读取一个目录及其子目录,并根据特定条件处理文件。我可以使用files.walkFileTree获取所有文件,但当我尝试移动它们时,会得到一个java.nio.file.AccessDeniedException

如果我试图复制它们,就会得到DirectoryNotEmptyException。我在谷歌上找不到任何帮助。我肯定有一种简单的方法可以将文件从一个目录移动到另一个目录,但我想不出来

这就是我试图得到DirectoryNotEmptyException的原因:

private static void findMatchingPdf(Path file, ArrayList cgbaFiles) {
    Iterator iter = cgbaFiles.iterator();
    String pdfOfFile = file.getFileName().toString().substring(0, file.getFileName().toString().length() - 5) + ".pdf";
    while (iter.hasNext()){
        Path cgbaFile = (Path) iter.next();
        if (cgbaFile.getFileName().toString().equals(pdfOfFile)) {
            try {
                Files.move(file, cgbaFile.getParent(), StandardCopyOption.REPLACE_EXISTING);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}
我正在遍历文件列表,试图将.meta文件与同名的.pdf文件进行匹配。找到匹配项后,我将元数据文件移动到包含pdf的目录中

我得到一个例外: java.nio.file.DirectoryNotEmptyException:C:\test\CGBA-RAC\Part-A 位于sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:372) 位于sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287) 位于java.nio.file.Files.move(Files.java:1347) 在cgba.rac.errorprocessor.errorprocessor.findMatchingPdf(errorprocessor.java:149)上 位于cgba.rac.errorprocessor.errorprocessor.matchErrorFile(errorprocessor.java:81) 位于cgba.rac.errorprocessor.errorprocessor.main(errorprocessor.java:36)

java.nio.file.Files是必需的,因此这里是经过编辑的解决方案。请查看它是否有效,因为我以前从未使用过新文件类

Files.move(file, cgbaFile.getParent(), StandardCopyOption.REPLACE_EXISTING);
对于目标,您提供了要将文件移动到的目录。这是不正确的。目标应该是您希望文件具有的新路径名——新目录加上文件名

例如,假设您想将
/tmp/foo.txt
移动到
/var/tmp
目录。当您应该调用
Files.move(“/tmp/foo.txt”、“/var/tmp”)时,您正在调用
Files.move(“/tmp/foo.txt”、“/var/tmp/foo.txt”)

您会遇到这个特定错误,因为JVM试图删除目标目录,以便用文件替换它

其中之一应该生成正确的目标路径:

Path target = cgbaFile.resolveSibling(file.getFileName());

Path target = cgbaFile.getParent().resolve(file.getFileName());

我在我的作品中编辑了一些代码。可能是《谢谢你》的副本,这是迄今为止我看到的最清楚的解释。
Path target = cgbaFile.resolveSibling(file.getFileName());

Path target = cgbaFile.getParent().resolve(file.getFileName());