Java使用递归复制文件夹及文件夹

当我们需要将一个文件夹内的所有文件和子文件夹都复制到另一个目录时,可以使用递归的方式来实现。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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 详解Java递归实现树形结构的两种方式

    详解Java递归实现树形结构的两种方式 引言 在Java程序中,树型结构是十分常见的,如目录结构、部门结构等等。而递归则是处理树型结构时最为常用的方式之一。本文将详细讲解Java如何递归实现树形结构,介绍两种不同的实现方式,并给出相应的代码示例。 方式一:使用递归函数进行深度优先遍历 递归函数是一个在函数内部调用自身的过程。使用递归函数可以方便地遍历树形结构…

    other 2023年6月27日
    00
  • Golang配置解析神器go viper使用详解

    当然!下面是关于\”Golang配置解析神器go viper使用详解\”的完整攻略: Golang配置解析神器go viper使用详解 go viper 是一个强大的 Golang 配置解析库,可以帮助我们轻松地读取和解析各种配置文件。以下是两个示例: 示例1:读取和解析 YAML 配置文件 package main import ( \"fmt\…

    other 2023年8月19日
    00
  • QT中出现“无法解析的外部符号”错误

    在QT中出现“无法解析的外部符号”错误通常是由于编译器无法找到所需的函数或变量定义,或者链接器无法找到所需的库文件。在本文中,我们将详细介绍解决这种错误的完整攻略,并提供两个示例说明。 解决“无法解析的外部符号”错误的攻略 1. 检查头文件和源文件 首先,我们需要检查头文件和源文件是否正确包含所需的函数或变量定义。如果头文件或源文件中缺少所需的定义,编译器将…

    other 2023年5月5日
    00
  • Windows11记事本打不开怎么办?Win11记事本提示无法启动此应用程序的解决方法

    Windows11记事本打不开怎么办? 在Windows 11系统中,记事本是一个非常常用的系统工具,但有时会出现无法启动的情况,这时候可能会提示“无法启动此应用程序”,该如何解决呢? 解决方法 方法1:使用命令提示符修复记事本 使用管理员权限打开命令提示符。在开始菜单中搜索“命令提示符”,然后右键点击,选择“以管理员身份运行”。 执行如下命令: Get-A…

    other 2023年6月25日
    00
  • 电脑安装cad后word打不开无法初始化该怎么办?

    问题描述:在安装CAD软件后,打开Word可能会出现无法初始化的错误提示。 解决方案如下: 1.卸载不兼容的插件或升级插件版本 有时候Word可能会与CAD软件安装的某些插件不兼容,导致打开Word时出现无法初始化的错误。此时可以尝试卸载这些插件或将其升级到最新版本。 比如,有网友反映网上流传的“AcadInventor.dll”插件和Word2010不兼容…

    other 2023年6月20日
    00
  • java获取手机已安装APK的签名摘要

    Java获取手机已安装APK的签名摘要的完整攻略 在Java中,我们可以使用PackageManager类和Signature类来获取手机已安装APK的签名摘要。以下是详细的步骤: 获取PackageManager对象 首先,我们需要获取PackageManager对象,用于获取已安装应用的信息。可以使用以下代码获取PackageManager对象: jav…

    other 2023年10月13日
    00
  • 08001无法远程连接sqlserver数据库800

    如果您在远程连接SQL Server数据库时遇到了“08001无法远程连接SQL Server数据库800”错误,可以按照以下步骤进行排查: 首先,您需要确认SQL Server是否已启用远程连接。默认情况下,SQL Server不允许远程连接。您可以按照以下步骤启用远程连接: 打开SQL Server Configuration Manager。 选择SQ…

    other 2023年5月7日
    00
  • 页面加载完成后再执行JS的jquery写法以及区别说明

    在网页中,我们经常需要在页面加载完成后再执行一些 JavaScript 代码。这个需求非常普遍,比如我们需要在 DOM 树构建完成后再去操作元素,或者需要等待图片等资源加载完成后再进行后续的逻辑处理。在这种需求下,我们可以使用 JQuery 提供的 ready() 方法来处理,同时,使用 ready() 方法还有一定的性能优势。下面是详细的攻略: 什么是 j…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部