美文网首页
719.【golang】复制文件夹到另一个文件夹

719.【golang】复制文件夹到另一个文件夹

作者: 七镜 | 来源:发表于2023-07-01 00:34 被阅读0次

一、背景

最近在写自动化配置程序(七镜将来会将其开源),网上没找着简单明了的实现复制文件夹到另一个文件夹的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
}

三、实现原理:

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

相关文章

  • Ubuntu下一些操作合集

    1、命令行 (1)查看当前路径 (2)移动文件夹到另一个文件夹 (3)复制一个文件夹到另一个路径下 (4)bash...

  • 学习小组Day2笔记--Drku

    服务器基本操作 Linux初始学习就是自如的从一个文件夹到另一个文件夹,如何查看这个文件夹的内容,如何粘贴、复制 ...

  • 电脑复制文件太慢?这款神器让你的电脑复制速度快N倍!

    我们经常需要用电脑复制文件,可能是从一个文件夹到另一个文件夹,或者从U盘到电脑,但有时候复制速度太慢,要是遇到大文...

  • linux下把文件夹复制到所有同名文件夹脚本

    需求:复制文件夹到Linux目录下,覆盖该Linux目录下所有同名文件夹 目标:Linux下,执行本脚本,输入文件...

  • 集成科大讯飞AIUI iOS SDK的坑

    报若干找不到iflyMSC中文件的错误解决方法:复制官方AIUI Demo中的jsoncpp文件夹到项目所在文件夹...

  • 一:Eclipse开发快捷键

    将一个文件夹变为编译后的源码:复制文件夹到项目中,右击文件夹,use 快捷键: 1:Ctrl+Shift+R,通过...

  • linux指令篇

    复制 将一个文件夹下的所有内容复制到另一个文件夹下 将一个文件夹复制到另一个文件夹下 删除一个文件夹及其下面的所有...

  • 常用LINUX指令总结

    复制cp将一个目录下所有文件(不包括文件夹),复制到另一个文件夹中cp 源文件夹地址// 目标文件夹地址(注意...

  • centos常用命令

    1、显示进程信息 2、结束进程 3、复制文件到指定目录 4、复制文件夹到指定目录 5、跳转到另一台主机 6、scp...

  • [SSH] 协议,连接、远程上传下载文件相关

    1:scp 从远程机器下载文件/文件夹到本地 注意远程文件与本地目录有空格 2:scp 上传本地文件/文件夹到...

网友评论

      本文标题:719.【golang】复制文件夹到另一个文件夹

      本文链接:https://www.haomeiwen.com/subject/htytudtx.html