当我们需要将一个文件夹内的所有文件和子文件夹都复制到另一个目录时,可以使用递归的方式来实现。Java在java.io
包中提供了File
类,可以用来读取和操作文件。
以下是使用递归复制文件夹及文件夹的完整攻略:
1. 获取源目录和目标目录
File sourceFolder = new File("sourceFolder");
File destinationFolder = new File("destinationFolder");
首先,我们需要获取源目录和目标目录,这里我们使用File
类来创建。
2. 定义复制函数
public static void copyFolder(File sourceFolder, File destinationFolder) throws IOException {
// 判断源文件夹是否存在,不存在直接返回
if (!sourceFolder.exists()) {
return;
}
// 如果目标文件夹不存在,就创建它
if (!destinationFolder.exists()) {
destinationFolder.mkdir();
}
// 获取源文件夹下所有文件和文件夹的列表
File[] files = sourceFolder.listFiles();
// 如果没有任何文件,就返回
if (files == null || files.length == 0) {
return;
}
// 复制文件和文件夹
for (File file : files) {
if (file.isFile()) {
// 如果是文件,直接复制
File newFile = new File(destinationFolder.getAbsolutePath() + File.separator + file.getName());
Files.copy(file.toPath(), newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
} else if (file.isDirectory()) {
// 如果是文件夹,递归调用复制函数
String folderName = file.getName();
File newFolder = new File(destinationFolder.getAbsolutePath() + File.separator + folderName);
newFolder.mkdir();
copyFolder(file, newFolder);
}
}
}
在这个函数中,我们使用了File
类中的listFiles()
函数来获取源目录下的所有文件和文件夹。然后,我们遍历这个列表,对每个文件或文件夹进行处理。如果是一个文件,我们直接复制它到目标目录下。如果是一个文件夹,我们就递归调用复制函数,并将该文件夹复制到目标目录下。
3. 调用复制函数
try {
copyFolder(sourceFolder, destinationFolder);
System.out.println("复制完成!");
} catch (IOException e) {
System.out.println("复制出错: " + e.getMessage());
}
我们只需要在代码中调用复制函数,传入源目录和目标目录即可完成复制操作。如上述示例代码所示,如果复制成功,输出"复制完成!",如果复制失败,则输出出错原因。
下面是一个完整的示例代码,演示了如何递归复制一个文件夹及其所有子文件夹和文件:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
public class CopyFolder {
public static void main(String[] args) {
File sourceFolder = new File("sourceFolder");
File destinationFolder = new File("destinationFolder");
try {
copyFolder(sourceFolder, destinationFolder);
System.out.println("复制完成!");
} catch (IOException e) {
System.out.println("复制出错: " + e.getMessage());
}
}
public static void copyFolder(File sourceFolder, File destinationFolder) throws IOException {
// 判断源文件夹是否存在,不存在直接返回
if (!sourceFolder.exists()) {
return;
}
// 如果目标文件夹不存在,就创建它
if (!destinationFolder.exists()) {
destinationFolder.mkdir();
}
// 获取源文件夹下所有文件和文件夹的列表
File[] files = sourceFolder.listFiles();
// 如果没有任何文件,就返回
if (files == null || files.length == 0) {
return;
}
// 复制文件和文件夹
for (File file : files) {
if (file.isFile()) {
// 如果是文件,直接复制
File newFile = new File(destinationFolder.getAbsolutePath() + File.separator + file.getName());
Files.copy(file.toPath(), newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
} else if (file.isDirectory()) {
// 如果是文件夹,递归调用复制函数
String folderName = file.getName();
File newFolder = new File(destinationFolder.getAbsolutePath() + File.separator + folderName);
newFolder.mkdir();
copyFolder(file, newFolder);
}
}
}
}
另外,以下是一个更加复杂的示例,演示了如何将文件夹A的所有子文件夹和文件复制到文件夹B中,然后在文件夹B的所有子文件夹和文件中,将所有扩展名为".txt"的文件删除:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
public class CopyDeleteFolder {
public static void main(String[] args) {
File sourceFolder = new File("A");
File destinationFolder = new File("B");
// 复制文件夹A到文件夹B
try {
copyFolder(sourceFolder, destinationFolder);
System.out.println("复制完成!");
} catch (IOException e) {
System.out.println("复制出错: " + e.getMessage());
}
// 删除文件夹B中所有txt文件
try {
deleteFiles(destinationFolder, ".txt");
System.out.println("删除成功!");
} catch (IOException e) {
System.out.println("删除出错: " + e.getMessage());
}
}
/**
* 复制文件夹
*/
public static void copyFolder(File sourceFolder, File destinationFolder) throws IOException {
// 判断源文件夹是否存在,不存在直接返回
if (!sourceFolder.exists()) {
return;
}
// 如果目标文件夹不存在,就创建它
if (!destinationFolder.exists()) {
destinationFolder.mkdir();
}
// 获取源文件夹下所有文件和文件夹的列表
File[] files = sourceFolder.listFiles();
// 如果没有任何文件,就返回
if (files == null || files.length == 0) {
return;
}
// 复制文件和文件夹
for (File file : files) {
if (file.isFile()) {
// 如果是文件,直接复制
File newFile = new File(destinationFolder.getAbsolutePath() + File.separator + file.getName());
Files.copy(file.toPath(), newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
} else if (file.isDirectory()) {
// 如果是文件夹,递归调用复制函数
String folderName = file.getName();
File newFolder = new File(destinationFolder.getAbsolutePath() + File.separator + folderName);
newFolder.mkdir();
copyFolder(file, newFolder);
}
}
}
/**
* 删除指定扩展名的文件
*/
public static void deleteFiles(File directory, String extension) throws IOException {
// 获取该目录下的所有文件
File[] files = directory.listFiles();
// 遍历每一个文件
for (File file : files) {
if (file.isDirectory()) {
// 如果是一个目录,递归调用该函数
deleteFiles(file, extension);
} else if (file.isFile() && file.getName().endsWith(extension)) {
// 如果是一个扩展名为".txt"的文件,就删除它
Files.deleteIfExists(Path.of(file.getPath()));
}
}
}
}
该示例代码首先将文件夹A的所有子文件夹和文件复制到文件夹B中,然后再删除文件夹B中所有后缀名为".txt"的文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java使用递归复制文件夹及文件夹 - Python技术站