如何使用Java NIO将所有文件从源目录移动到目标目录,并将现有文件保留在目标目录中



我在Windows中使用Java 8,我正在努力实现一件简单的事情。假设我有一个source目录和一个destination目录。我每天都在尝试将文件从源移动到目标。下面是一个简单的java代码,使用NIO;

Path sourcePath = Paths.get("C:\source");
Path destinationPath = Paths.get("C:\destination");
try {
Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
e.printStackTrace();
}

在第一次运行中,这将正常工作,因为目标是空的。在第二次运行时,或者如果目标不为空,NIO将抛出异常;

java.nio.file.DirectoryNotEmptyException: C:destination
at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:373)
at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287)
at java.nio.file.Files.move(Files.java:1395)
at instacopy.Test.main(Test.java:14)

我正在努力实现的是;

  1. 应该将新文件从源移动到目标
  2. 若目标中存在同名文件,则应将其替换为新文件

这可能吗?如果是,我该怎么做?

首先:

最好只测试文件夹是否为空。

无论如何,为了覆盖dest中的文件,请切中要害:IMO的最佳选择是使用apache commons.io FileUtils:

FileUtils.copyDirectory(srcDir, destDir);

然后删除源目录中的文件

FileUtils.copyDirectory desc:将整个目录复制到保留文件日期的新位置。

此方法将指定的目录及其所有子目录和文件复制到指定的目标。目标是目录的新位置和名称。

如果目标目录不存在,则会创建该目录。如果目标目录确实存在,则此方法将源与目标合并,以源为优先。

使用java nio的另一个选项-您需要遍历文件,并为每个文件复制和覆盖

Paths target;
try (Stream<Path> paths = Files.walk(sourcePath)) {
paths.forEach((srcPath)->{Files.copy(srcPath, target, StandardCopyOption.REPLACE_EXISTING);});
} catch (IOException e) {
e.printStackTrace();
}

然后删除源目录中的文件

相关内容

  • 没有找到相关文章