需求分析
- 要复制目录下的所有文件,需要使用递归,将所有文件&目录路径保存下来
public static void getAllFiles(File directory, ArrayList<File> files, ArrayList<File> dirs) {
if (directory.isDirectory()) {
dirs.add(directory);
for (var f : directory.listFiles()) {
getAllFiles(f, files, dirs);
}
} else {
files.add(directory);
}
}
- 根据缓存的目录信息,创建新的目录结构
for (var d : dirs) {
String to = d.getAbsolutePath().replace(fromDir, toDir);
new File(to).mkdirs();
}
- 根据缓存的文件路径,将原路径下的文件复制到新路径下
for (var f : files) {
String to = f.getAbsolutePath().replace(fromDir, toDir);
try {
Files.copy(Paths.get(f.getPath()), new FileOutputStream(new File(to)));
} catch (IOException e) {
System.out.println(e);
}
}
代码实现
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Scanner;
public class FileCopy {
public static void main(String[] args) {
String fromDir = "D:\\repos\\Java Projects";
String toDir = "D:\\repos\\Java_Pro_Copied";
Scanner scanner = new Scanner(System.in);
System.out.print("输入原始目录:");
fromDir = scanner.nextLine();
File rootDir = new File(fromDir);
while (!rootDir.exists()) {
System.out.print("目录或文件不存在,请重新输入:");
fromDir = scanner.nextLine();
}
System.out.print("输入要拷贝到的目录:");
toDir = scanner.nextLine().replace('/', '\\');
scanner.close();
copyDir(fromDir, toDir);
System.out.println("拷贝完成!");
}
public static void copyDir(String fromDir, String toDir) {
fromDir = fromDir.replace('/', '\\');
toDir = toDir.replace('/', '\\');
var files = new ArrayList<File>();
var dirs = new ArrayList<File>();
getAllFiles(new File(fromDir), files, dirs);
for (var d : dirs) {
String to = d.getAbsolutePath().replace(fromDir, toDir);
new File(to).mkdirs();
}
for (var f : files) {
String to = f.getAbsolutePath().replace(fromDir, toDir);
try {
Files.copy(Paths.get(f.getPath()), new FileOutputStream(new File(to)));
} catch (IOException e) {
System.out.println(e);
}
}
}
public static void getAllFiles(File directory, ArrayList<File> files, ArrayList<File> dirs) {
if (directory.isDirectory()) {
dirs.add(directory);
for (var f : directory.listFiles()) {
getAllFiles(f, files, dirs);
}
} else {
files.add(directory);
}
}
}