golang复制文件夹移动到另一个文件夹实现方法详解

 更新时间:2023年07月05日 12:00:33   作者:七镜  
这篇文章主要为大家介绍了golang复制文件夹并移动到另一个文件夹实现方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、背景

最近在写自动化配置程序(七镜将来会将其开源),网上没找着简单明了的实现复制文件夹到另一个文件夹的golang实现方法,于是七镜自己实现了一个。

二、源代码

package main
import (
    "log"
    "os"
    "regexp"
    "strings"
)
func main() {
    // 调用 CopyDir 函数,将源文件夹下的所有文件和子文件夹拷贝到目标文件夹
    count, err := CopyDir("E:\\personal\\golang\\config\\webserver", ".\\output")
    if err != nil {
        log.Fatal(err)
    }
    log.Println(count)
}
// CopyDir 函数接受两个字符串参数,分别表示源文件夹和目标文件夹的路径
// 返回值是拷贝的文件数量和可能发生的错误
func CopyDir(src, dst string) (count int, err error) {
    // 使用正则表达式将路径按照 / 或 \ 分割成切片
    regexp1, err := regexp.Compile(`(/|\\)`)
    if err != nil {
        return 0, err
    }
    srcSplits := regexp1.Split(src, 10000)
    dstSplits := regexp1.Split(dst, 10000)
    // 调用 CopyDirInner 函数,传入源文件夹和目标文件夹的前缀和最后一级名称
    return CopyDirInner(strings.Join(srcSplits[:len(srcSplits)-1], "/"), srcSplits[len(srcSplits)-1], strings.Join(dstSplits[:len(dstSplits)-1], "/"), dstSplits[len(dstSplits)-1])
}
// CopyDirInner 函数接受四个字符串参数,分别表示源文件夹和目标文件夹的前缀和最后一级名称
// 返回值是拷贝的文件数量和可能发生的错误
func CopyDirInner(srcPrefix, src string, dstPrefix, dst string) (count int, err error) {
    // 如果前缀为空,则设置为当前目录
    if srcPrefix == "" {
        srcPrefix = "."
    }
    if dstPrefix == "" {
        dstPrefix = "."
    }
    // 读取源文件夹下的所有文件和子文件夹
    dirs, err := os.ReadDir(srcPrefix + "/" + src)
    if err != nil {
        return 0, err
    }
    // 在目标文件夹下创建同名的子文件夹
    pathCursor := dstPrefix + "/" + dst + "/" + src
    err = os.MkdirAll(pathCursor, 0600)
    if err != nil {
        return 0, err
    }
    for _, dir := range dirs {
        if dir.IsDir() {
            // 如果是子文件夹,则递归调用 CopyDirInner 函数,传入相应的参数
            countSub, err := CopyDirInner(srcPrefix+"/"+src, dir.Name(), dstPrefix+"/"+dst, src)
            if err != nil {
                return 0, err
            }
            count += countSub
        } else {
            // 如果是文件,则读取其内容,并写入到目标文件夹下同名的文件中
            bytesFile, err := os.ReadFile(srcPrefix + "/" + src + "/" + dir.Name())
            if err != nil {
                return 0, err
            }
            err = os.WriteFile(pathCursor+"/"+dir.Name(), bytesFile, 0600)
            if err != nil {
                return 0, err
            }
            count++
        }
    }
    return count, nil
}

三、实现原理

  • 输入源文件夹路径,目标文件夹路径,实现一个函数迭代源文件夹路径中的所有文件和目录;
  • 如果是目录则继续递归调用这个函数;
  • 如果是文件,就将文件复制到目标文件夹路径下。

以上就是golang复制文件夹并移动到另一个文件夹实现方法详解的详细内容,更多关于golang复制文件夹的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言学习之Switch语句的使用

    Go语言学习之Switch语句的使用

    这篇文章主要通过一些示例为大家介绍一下Go语言中Switch语句的基本语法以及使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-06-06
  • Golang实现自己的Redis数据库内存实例探究

    Golang实现自己的Redis数据库内存实例探究

    这篇文章主要为大家介绍了Golang实现自己的Redis数据库内存实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言开发编程规范命令风格代码格式

    Go语言开发编程规范命令风格代码格式

    这篇文章主要为大家介绍了Go语言开发编程规范命令风格代码格式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言超时退出的三种实现方式总结

    Go语言超时退出的三种实现方式总结

    这篇文章主要为大家详细介绍了Go语言中超时退出的三种实现方式,文中的示例代码简洁易懂,对我们深入了解Go语言有一定的帮助,需要的可以了解一下
    2023-06-06
  • Go语言简介和环境配置

    Go语言简介和环境配置

    Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发速度和易维护性,有人形容Go语言:Go= C + Python , 说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发,这篇文章主要介绍了Go介绍和环境配置,需要的朋友可以参考下
    2022-07-07
  • Web框架Gin中间件实现原理步骤解析

    Web框架Gin中间件实现原理步骤解析

    这篇文章主要为大家介绍了Web框架Gin中间件实现原理步骤解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go中各种newreader和newbuffer的使用总结

    Go中各种newreader和newbuffer的使用总结

    这篇文章主要为大家详细介绍了Go语言中各种newreader和newbuffer的使用的相关资料,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解下
    2023-11-11
  • Golang异常处理之优雅地控制和处理异常

    Golang异常处理之优雅地控制和处理异常

    在Golang中,异常处理是非常重要的一部分,能够有效地控制和处理代码中的异常情况。通过Golang的异常处理机制,可以优雅地捕获和处理异常,保障代码的可靠性和稳定性。同时,Golang还提供了丰富的工具和API,帮助开发者更加轻松地进行异常处理
    2023-04-04
  • Go语言json编码驼峰转下划线、下划线转驼峰的实现

    Go语言json编码驼峰转下划线、下划线转驼峰的实现

    这篇文章主要介绍了Go语言json编码驼峰转下划线、下划线转驼峰的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Go语言的文件名、标识符、关键字和包基础教程

    Go语言的文件名、标识符、关键字和包基础教程

    Go的关键字不能被用作标识符,这是一个重要的限制,以避免命名冲突和语法混淆,这篇文章主要给大家介绍了关于Go语言文件名、标识符、关键字和包的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06

最新评论