Golang实现递归复制文件夹

news2025/3/15 17:14:03

代码

package zdpgo_file

import (
	"errors"
	"os"
	"path/filepath"
	"strings"
)

// CopyDir 复制文件夹
// @param srcPath 源文件夹
// @param desPath 目标文件夹
// @return error 错误信息
func CopyDir(srcPath, desPath string) error {
	// 检查目录是否正确
	if !IsDir(srcPath) {
		return errors.New("要复制的文件夹不存在")
	}

	// 源文件夹和目标文件夹不能相同
	if strings.TrimSpace(srcPath) == strings.TrimSpace(desPath) {
		return errors.New("源文件夹和目标文件夹不能相同")
	}

	// 创建目标文件夹
	if !IsDir(desPath) {
		err := AddDir(desPath)
		if err != nil {
			return err
		}
	}

	// 路径规范
	srcPath = strings.Replace(srcPath, "\\", "/", -1)
	desPath = strings.Replace(desPath, "\\", "/", -1)

	// 遍历源文件夹
	err := filepath.Walk(srcPath, func(path string, f os.FileInfo, err error) error {
		if f == nil {
			return err
		}

		// 复制目录是将源目录中的子目录复制到目标路径中,不包含源目录本身
		if path == srcPath {
			return nil
		}

		// 生成新路径
		destNewPath := desPath + "/" + path
		destNewPath = strings.Replace(destNewPath, "\\", "/", -1)

		// 如果发生了递归,则退出
		if strings.Count(destNewPath, desPath) > 1 {
			return nil
		}

		// 如果是文件:复制文件
		// 如果是文件夹:不存在就创建新文件夹
		if !f.IsDir() {
			err = CopyFile(path, destNewPath)
			if err != nil {
				return err
			}
		} else {
			if !IsExist(destNewPath) {
				return AddDir(destNewPath)
			}
		}

		return nil
	})

	// 返回
	return err
}

测试

package zdpgo_file

import "testing"

func TestCopyDir(t *testing.T) {
	if err := AddDir("test"); err != nil {
		t.Fatal(err)
	}

	data := []struct {
		Src string
		Dst string
	}{
		{".", "test/test2"},
		{"test/test2", "test/test1"},
	}

	for _, tt := range data {
		v := CopyDir(tt.Src, tt.Dst)
		if v != nil {
			t.Error(v)
		}
	}
}

测试结果

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习第十次课

前言 因为考了一次试,所以没讲太多新东西,唯一的问题是有的知识刚讲完就考了,导致我爆了...... 正文 主要讲的就是一个贝叶斯分类模型,这是属于生成式的分类器了 Bayesian decision theory 我的理解是贝叶斯公式则是利用条件概率和全概率公式计算后验概率,就这么简单 但是…

智慧农业可视化大屏,当个农民是不是小伙伴的梦想。

智慧农业可视化大屏是指通过数据可视化技术,将农业生产过程中的各种数据、指标和信息以图表、图像等形式展示在大屏上,以便农业从业者能够直观地了解农田、作物、气象、设备等方面的情况,从而进行农业生产的监控、管理和决策。以下是智慧农业…

怎么快速批量导出文本二维码?文件批量生码的方法和步骤

随着互联网的快速发展,二维码的应用也越来越广泛,现在很多二维码会用来展示物品信息,将编辑好的文字内容生成二维码之后,让其他人通过扫码的方式来获取相关内容。那么当有多条信息时,有什么方法能够一次批量生成二维码…

PHP质量工具系列之php_CodeSniffer

PHP_CodeSniffer 是一组两个 PHP 脚本:主脚本 phpcs 对 PHP、JavaScript 和 CSS 文件进行标记,以检测是否违反定义的编码标准;第二个脚本 phpcbf 自动纠正违反编码标准的行为。PHP_CodeSniffer 是一个重要的开发工具,可以确保你的…

04Django项目基本运行逻辑及模板资源套用

对应视频链接点击直达 Django项目用户管理及模板资源 对应视频链接点击直达1.基本运行逻辑Django的基本运行路线:视图views.py中的 纯操作、数据返回、页面渲染 2.模版套用1.寻找一个好的模版2.模板部署--修改适配联动 OVER,不会有人不会吧不会的加Q1394…

AI大模型到底能帮我干什么?

这周百度文心一言大模型正式发布了,不少网民拿着各种段子搞笑和玩梗。我在的其中某个微信群里,一位老兄针对当下的大模型,发出来如下的问题: 大家这么玩梗真没意思 我一直没弄明白这些大模型怎么帮助我工作 这个问题有一定的代表性…

关于sklearn决策树手动指定节点进行剪枝调整的实现

一、决策树剪枝 决策树的剪枝方式有两种,预剪枝和后剪枝,后剪枝在python的sklearn方法中提供了CCP代价复杂度剪枝法(Cost Complexity Pruning)具体实现代码如下: # -*- coding: utf-8 -*- from sklearn.datasets imp…

Java入门基础学习笔记44——String

为什么要学习String的处理呢? 开发中,对字符串的处理是非常常见的。 String是什么?可以做什么? java.lang.String 代表字符串。可以用来创建对象封装字符串数据,并对其进行处理。 1、创建对象 2、封装字符串数据 3…

超过GPT4.0?Claude3官网及国内镜像站,国内使用克劳德3的方法

近期又有一个大模型横空出世,这就是由Anthropic公司推出的Claude 3(克劳德3),在多项基准测试中得分超越了GPT-4,那么他到底是什么情况呐?其实大家在国内也是可以使用上的! 克劳德Claude3 关于…

Python 闭包的高级用法详解

所谓闭包,就是指内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程,这个内函数称之为闭包函数。可以理解为是函数式编程中的封装。 内部函数可以使用外部函数定义的属性:外部函数调用后,返回内部函数的地…

Java入门基础学习笔记36——面向对象基础

面向对象编程快速入门: 计算机是用来处理数据的。 单个变量 数组变量 对象数据 Student类: package cn.ensource.object;public class Student {String name;double chinese_score;double math_score;public void printTotalScore() {System.out.pr…

AUTOMATIC1111/stable-diffusion-webui/stable-diffusion-webui-v1.9.3

配置环境介绍 目前平台集成了 Stable Diffusion WebUI 的官方镜像,该镜像中整合如下资源: GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本:v1.9.3 Python版本:3.10.…

HCIE是什么证书?为什么要考?

每当我发一些关于HCIE的话题时,总有小伙伴过来问“啥是HCIE啊?”今天就一起来了解下,到底什么是HCIE?为什么这么多人都要考HCIE? HCIE是华为认证ICT专家的缩写,它是华为认证体系中最高级别的ICT技术认证。HCIE全称为H…

windows 设置系统字体 (win11 win10)

由于微软的字体是有版权的,所以我打算替换掉 1.下载替换工具 github的项目,看起来很多人对微软默认字体带版权深恶痛绝。 项目地址:nomeiryoUi地址 这里选取最新的版本即可 2.打开软件 这里显示标题栏不能改,确认,其…

使用Systemd 设置Python程序开机启动

在 Linux 系统中设置Python 脚本开机启动,通常可以通过以下几种方式实现: 1. 使用 systemd(推荐方式) systemd 是大多数现代 Linux 发行版使用的初始化系统和服务管理器。你可以为Python 脚本创建一个 systemd 服务文件&#xf…

鸿蒙ArkUI-X平台差异化:【运行态差异化(@ohos.deviceInfo)】

平台差异化 简介 跨平台使用场景是一套ArkTS代码运行在多个终端设备上,如Android、iOS、OpenHarmony(含基于OpenHarmony发行的商业版,如HarmonyOS Next)。当不同平台业务逻辑不同,或使用了不支持跨平台的API&#xf…

Android开发-Android开发中的TCP与UDP通信策略的实现

Android 开发中的 TCP 与 UDP 通信策略的实现 1. 前言2. 准备工作3. Kotlin 中 TCP 通信实现客户端代码示例:服务器代码示例: 4. Kotlin 中 UDP 通信实现客户端代码示例:服务器代码示例: 5. TCP 与 UDP 应用场景分析TCP 实现可靠传…

词条唤夜兽唤夜兽的养殖与护理 幻兽帕鲁 唤夜兽怎么获取 唤夜兽去哪里抓 crossover玩Steam游戏

唤夜兽在地图上没有出现,是唤冬兽和雷冥鸟共同培育出来的帕鲁。 ------------------------- 介绍: 帕洛斯群岛之守护神,拥呼唤黑夜之力。 其会于灾厄席捲大地之际腾空而起,唤来无尽暗夜,试图封印灾厄。 ---------…

Video-FocalNets: Spatio-Temporal Focal Modulation for Video Action Recognition

标题:Video-FocalNets:用于视频动作识别的时空聚焦调制 源文链接:Wasim_Video-FocalNets_Spatio-Temporal_Focal_Modulation_for_Video_Action_Recognition_ICCV_2023_paper.pdf (thecvf.com)https://openaccess.thecvf.com/content/ICCV202…

深入解析文华量化交易策略---交易指令如何选择

随着金融投资的迅猛发展,自动化策略模型已逐渐成为现代投资领域的一股重要力量。量化交易模型均以数据为驱动,通过运用数学模型和算法,对期货、黄金等投资市场走势进行精准预测和高效交易。 艾云策略整理了量化策略相关资料,希望通…