Golang实现递归复制文件夹

代码

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)
		}
	}
}

测试结果

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

张量 t-product 积(matlab代码)

参考文献:Tensor Robust Principal Component Analysis with a New Tensor Nuclear Norm 首先是文章2.3节中 t-product 的定义: 块循环矩阵: 参考知乎博主的例子及代码:(t-product与t-QR分解,另一篇傅里叶对…

200smart【编程入门】

说明 编程时,遇到困难就按【F1】 【I】输入 200smart 上限 i0.0~i31.7 255bit【255个输入点】 i0.0~i31.7 八进制 【布尔 bool 】 ib0~ib127 【单字节】 8bit iw0~iw127 …

六零导航页 file.php 任意文件上传漏洞复现(CVE-2024-34982)

0x01 产品简介 LyLme Spage(六零导航页)是中国六零(LyLme)开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口,支持后台添加链接、自定义搜索引擎,沉淀最具价值链接,全站无商业推广,简约而不简单。 0x02 漏洞概述 六零导航页 file.php接口处任意文件上传…

Java面试八股之++操作符是线程安全的吗

操作符是线程安全的吗 操作符本身在Java中并不是线程安全的。这个操作实际上包含三个步骤:读取变量的值、将值加1、然后将新值写回内存。在多线程环境下,如果多个线程同时对同一个变量执行操作,就可能出现竞态条件(race conditio…

TransFormer学习之基础知识:STN、SENet、CBAM、Self-Attention

1.空间注意力机制STN 参考链接:STN(Spatial Transformer Networks) 参考链接:通俗易懂的Spatial Transformer Networks(STN) 核心动机: 在空间中捕获重要区域特征(如图像中的数字),将核心区域进行放大居中,使得结果更…

K8S认证|CKA题库+答案| 7. 调度 pod 到指定节点

7、调度 pod 到指定节点 您必须在以下Clusterd/Node上完成此考题: Cluster Master node Worker node hk8s master …

GS5812G 21V、2A同步降压DC/DC转换器芯片IC

一般描述 该GS5812G是一个同步降压DC/DC转换器与快速恒定的时间(FCOT)模式控制。该器件提供4. 5V至21V的输入电压范围和2A连续负载电流能力。它是恒定时间脉宽调制(PWM)控制器,支持 FCOT模式控制。工作频率取决于输入和输出电压条件。 该GS5812G故障…

桌面藏线大法

1有线改无线: 蓝牙鼠标 蓝牙键盘 蓝牙耳机 2将排插贴到桌子底下 购物软件上搜 3断舍离 不要的电子产品统统扔掉 4 洞洞板和挂钩 这个不用介绍了

uniapp中使用mockjs模拟接口测试总结(swiper轮播图示例)

完整总结下在uni-app中如何使用Mock.js模拟接口测试,这在后台接口未就绪的情况下非常有用。同时也给出个首页swiper轮播图的mock接口使用。网上的文章都不太完整,这里总结下完整的使用示例,同时也支持h5和小程序平台,分享给需要的…

个人感觉对Material设计有用的几个网址

(一) Modular and customizable Material Design UI components for Android GIthub: material-components-android (二) 学习Material设计 Material Design (三) 用于创建Material主题,支持导出多种格式 material-theme-builder

谷歌蜘蛛池是什么?

或称为谷歌爬虫池,是一项专门针对谷歌搜索引擎优化(SEO)的先进技术,这种技术的主要目的是通过建立庞大的网站群体和复杂的链接结构来吸引和维持谷歌的爬虫程序的注意力,其核心是通过这种结构优化,增强特定网…

ESP32 实现获取天气情况

按照小安派AiPi-Eyes天气站思路,在ESP32 S3上实现获取天气情况。 一、在ESP32 S3实现 1、main.c 建立2个TASK void app_main(void) {//lvgl初始化xTaskCreate(guiTask, "guiTask", 1024 * 6, NULL, 5, NULL);//wifi初始化、socket、json处理taskcustom_…

Xcode代码格式化SwiftFormat安装使用,以及不生效问题

官方仓库地址:GitHub - nicklockwood/SwiftFormat: A command-line tool and Xcode Extension for formatting Swift code 安装SwiftFormat 有两种安装方式,两种方式都可以,二选一即可: 第一种使用brew,如果已经使用…

AWPortrait1.4更新,人物的生成更加趋近真实感,将SD1.5人像的真实感提升到了一个新的高度

AWPortrait1.4更新,人物的生成更加趋近真实感,将SD1.5人像的真实感提升到了一个新的高度 经过5个月,AWPortrait终于迎来了1.4。 本次更新基于1.3训练,使得人物的生成更加趋近真实感,将SD1.5人像的真实感提升到了一个新…

《二》MP3在线搜索所歌曲的实现

上一期我们大致实现了布局等操作 那么这一期我们来实现如何去搜索歌曲: 首先呢,我们是设计多媒体,要包含多媒体类头文件,还要能在线搜索,那就要包含网络上的头文件,还要实现打开文件操作,处理…

618知识狂欢,挑本好书,点亮智慧生活!

618精选编程书单:提升你的代码力 一年一度的618又到啦!今年的618就不要乱买啦,衣服买多了会被淘汰,电子产品买多了会过时,零食买多了会增肥,最后怎么看都不划算。可是如果你购买知识,坚持阅读&a…

k8s节点亲和性配置

在Kubernetes中,你可以使用节点亲和性(Node Affinity)来控制Pod调度到特定的节点上。节点亲和性是通过Pod的spec.affinity.nodeAffinity属性来设置的。 以下是一个配置节点亲和性的YAML示例: apiVersion: v1 kind: Pod metadata…

nss刷题(3)

1、[SWPUCTF 2021 新生赛]include 根据提示传入一个file后显示了关于flag的代码 这是一个文件包含,考虑php伪协议,构造payload: ?filephp://filter/readconvert.base64-encode/resourceflag.php 2、[SWPUCTF 2021 新生赛]Do_you_know_http …

HTML5 + CSS3模拟庆余年中“五竹”的镭射眼动画特效

庆余年2已经火热开播了,据说反响强烈啊,不知道这一部里面,五竹的镭射眼会不会表现出来,我还挺想看看他的镭射眼的,我看到底有没有杀死剧中的庆帝。 回想第一部,我都快记不清那是几年前开播的了,…

【QT八股文】系列之篇章2 | QT的信号与槽机制及通讯流程

【QT八股文】系列之篇章2 | QT的信号与槽机制及通讯流程 前言2. 信号与槽信号与槽机制介绍/本质/原理,什么是Qt信号与槽机制?如何在Qt中使用?信号与槽机制原理,解析流程Qt信号槽的调用流程信号与槽机制的优缺点信号与槽机制需要注…