首页 > 其他分享 >go复制文件,文件夹

go复制文件,文件夹

时间:2022-09-21 18:00:41浏览次数:72  
标签:src return nil err var 文件夹 复制 go os

在go中复制文件夹内容需要递归来一层层检查文件夹是否存在,不存在则创建文件。

package util

import (
	"fmt"
	"io"
	"os"
	"path"
)

type Duplication struct{
}

func New()*Duplication{
	return &Duplication{}
}


//文件复制
func (d *Duplication)File(src, dst string) error {
	var err error
	var srcfd *os.File
	var dstfd *os.File
	var srcinfo os.FileInfo

	if srcfd, err = os.Open(src); err != nil {
		return err
	}
	defer srcfd.Close()

	if dstfd, err = os.Create(dst); err != nil {
		return err
	}
	defer dstfd.Close()

	if _, err = io.Copy(dstfd, srcfd); err != nil {
		return err
	}
	if srcinfo, err = os.Stat(src); err != nil {
		return err
	}
	return os.Chmod(dst, srcinfo.Mode())
}

// 文件夹复制
func (d *Duplication)Dir(src string, dst string) error{
	var err error
	var fds []os.DirEntry
	var srcinfo os.FileInfo

	if srcinfo, err = os.Stat(src); err != nil {
		return err
	}

	if err = os.MkdirAll(dst, srcinfo.Mode()); err != nil {
		return err
	}

	//if fds, err = ioutil.ReadDir(src); err != nil {
	//	return err
	//}
	fds, err = os.ReadDir(src)
	if err != nil {
		return err
	}

	for _, fd := range fds {
		srcfp := path.Join(src, fd.Name())
		dstfp := path.Join(dst, fd.Name())

		if fd.IsDir() {
			if err = d.Dir(srcfp, dstfp); err != nil {
				fmt.Println(err)
			}
		} else {
			if err = d.File(srcfp, dstfp); err != nil {
				fmt.Println(err)
			}
		}
	}
	return nil
}

本文参考自https://blog.csdn.net/whatday/article/details/109709845?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-5-109709845-blog-122420214.topnsimilarv1&spm=1001.2101.3001.4242.4&utm_relevant_index=8

标签:src,return,nil,err,var,文件夹,复制,go,os
From: https://www.cnblogs.com/zly-go/p/16716553.html

相关文章

  • 使用FileStream来实现复制功能
    staticvoidMain(string[]args){stringsource=@"D:\桌面\demo.txt";stringtarget=@"D:\桌面\demo2.txt";CopyF......
  • etcd从入门到入睡(Go语言客户端)
    安装etcd这里我使用的Docker安装,命令如下:dockerpullquay.io/coreos/etcd:v3.5.1或者参考此篇使用预编译好的二进制执行文件,指路:etcd安装。搭建etcd集群这里我使用do......
  • Cannot read properties of null (reading 'pickAlgorithm')的解决方法
    在使用npmi安装项目的依赖包时,出现如下报错:解决办法执行npmcacheclear--force指令后,再执行npmi即可正常安装依赖包......
  • protobuf如何使用google内置的proto文件中的消息体
    下载依赖goget-ugoogle.golang.org/protobuf目录结构将google自带的timestamp.proto文件拷贝到我们的项目目录中文件地址编写hello.proto文件syntax="proto3";......
  • go安装服务
    golang安装程序为服务packagemainimport("context""fmt""io""log""net/http""os""path/filepath""github.com/gin-gonic......
  • 获得 Google 数据分析证书后 60 天
    获得Google数据分析证书后60天好日子的读者,GoogleDataAnalyticsCertificate在完成我的谷歌数据分析专业证书2个月~60天后,我不得不说这是一段地狱般的旅程,......
  • 记录goland编辑器项目可运行但是代码爆红的解决办法
    问题描述goget-u项目之后飘红还以为是版本不兼容,虽然对功能不影响,但是看着一片红很闹心啊,特此记录一下解决办法,以便下次使用。解决办法步骤一:点击工具栏File,找到In......
  • mongodb第三篇:聚合操作
    先认识几个关键字aggregategroupreducemerge 1、根据description字段进行分组,只返回分组字段值db.$collectionName.aggregate({"$group":{"_id":"$description"}})......
  • OpenSergo & CloudWeGo 共同保障微服务运行时流量稳定性
    简介: 流控降级与容错是微服务流量治理中的重要的一环,同时MSE还提供更广范围、更多场景的微服务治理能力,包括全链路灰度、无损上下线、微服务数据库治理、日志治理等一系......
  • scp双向复制命令
    实例1:从本地服务器复制到远程服务器: (1) 复制文件:  命令格式:  scp local_file remote_username@remote_ip:remote_folder  样例scptest.sqlroot@10.51.7.......