文章目录
-
- 前言
- 案例Demo
- 注意点
前言
将一个目录下的文件 复制一份到新的 文件目录。如果原始文件带有权限。
案例Demo
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class CopyMoveDirectoryWithPermissions {
public static void main(String[] args) {
Path sourceDirectory = Paths.get("path/to/source/directory");
Path destinationDirectory = Paths.get("path/to/destination/directory");
try {
// 删除目标目录下的所有内容
deleteDirectory(destinationDirectory);
// 复制整个目录
copyDirectory(sourceDirectory, destinationDirectory);
// 或者移动整个目录
// moveDirectory(sourceDirectory, destinationDirectory);
System.out.println("Directory copied/moved successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void deleteDirectory(Path directory) throws IOException {
if (Files.exists(directory)) {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
}
private static void copyDirectory(Path source, Path destination) throws IOException {
Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path targetDir = destination.resolve(source.relativize(dir));
Files.copy(dir, targetDir, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path targetFile = destination.resolve(source.relativize(file));
Files.copy(file, targetFile, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
return FileVisitResult.CONTINUE;
}
});
}
private static void moveDirectory(Path source, Path destination) throws IOException {
Files.move(source, destination, StandardCopyOption.REPLACE_EXISTING);
}
}
注意点
第一点
目标目录不能是两次以上不存在的目录、创建不成功。不存在的一层目录、可以创建成功
第二点
java.nio.file.DirectoryNotEmptyException: E:\data\myimage
这个异常通常是因为在尝试移动目录时,目标目录非空而抛出的。在你的情况中,可能是目标目录 E:\data\myimage 非空,而你在尝试移动源目录到这个位置。如果你想要覆盖目标目录,你可以使用递归删除目标目录下的所有内容,然后再移动源目录。【案例Demo就是先删除 后复制移动】