go golang 复制整个文件夹 复制整个目录 复制文件

复制文件夹,支持绝对路径和相对路径
form := "build/"
to := "./build-cp/"
fmt.Println(Copy(form, to))
复制单文件,同样支持绝对路径和相对路径
form := "build/Dockerfile"
to := "./build-cp/Dockerfile"
fmt.Println(Copy(form, to))
Copy方法
func Copy(from, to string) error {
    var err error

    f, err := os.Stat(from)
    if err != nil {
        return err
    }

    fn := func(fromFile string) error {
        //复制文件的路径
        rel, err := filepath.Rel(from, fromFile)
        if err != nil {
            return err
        }
        toFile := filepath.Join(to, rel)

        //创建复制文件目录
        if err = os.MkdirAll(filepath.Dir(toFile), 0777); err != nil {
            return err
        }

        //读取源文件
        file, err := os.Open(fromFile)
        if err != nil {
            return err
        }

        defer file.Close()
        bufReader := bufio.NewReader(file)
        // 创建复制文件用于保存
        out, err := os.Create(toFile)
        if err != nil {
            return err
        }

        defer out.Close()
        // 然后将文件流和文件流对接起来
        _, err = io.Copy(out, bufReader)
        return err
    }

    //转绝对路径
    pwd, _ := os.Getwd()
    if !filepath.IsAbs(from) {
        from = filepath.Join(pwd, from)
    }
    if !filepath.IsAbs(to) {
        to = filepath.Join(pwd, to)
    }

    //复制
    if f.IsDir() {
        return filepath.WalkDir(from, func(path string, d fs.DirEntry, err error) error {
            if !d.IsDir() {
                return fn(path)
            } else {
                if err = os.MkdirAll(path, 0777); err != nil {
                    return err
                }
            }
            return err
        })
    } else {
        return fn(from)
    }
}
如果你在linux/mac中运行代码,你可以执行system的cp命令
srcFolder := "copy/from/path"
destFolder := "copy/to/path"
cpCmd := exec.Command("cp", "-rf", srcFolder, destFolder)
err := cpCmd.Run()

你可能感兴趣的:(go golang 复制整个文件夹 复制整个目录 复制文件)