drmcm84800 2019-06-10 05:04
浏览 69

带条件复制目录

I have a task to copy directory, and paste it in an another folder with conditions using Go. For example I have a directory tree such like that:
project
---app(where to copy)
---packages(from where copy)
------process
---------client01
------------build(folder)
---------------main.go
---------------config.json
---------------someFolder
------------someText.txt
---------client02
------------test4
---------------build
------------testProject
---------client04
------------projectX
------------test.go The condition is copying only directory which only has child folder with name "build" and in the copied parent folder should be only build folder within its files.

package main

import (
    "io"
    "io/ioutil"
    "os"
    "path"
)
// File copies a single file from src to dst
func 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())
}
// Dir copies a whole directory recursively
func Dir(src string, dst string) error {
    //var files Files
    var err error
    var fds []os.FileInfo
    var srcinfo os.FileInfo

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

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

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


        if fd.IsDir() && srcfp == src + "/build"  {
            //files = append(files, dstfp)
            println(srcfp)
            if err = Dir(srcfp, dstfp); err != nil {
                return err
            }
            if err = File(srcfp, dstfp); err != nil {
                return err
            }
        } else if fd.IsDir() && srcfp == srcfp {
            if err = Dir(srcfp, dstfp); err != nil {
                return err
            }
        } else {
            if err = File(srcfp, dstfp); err != nil {
                return err
            }
        }

    }
    return nil
}

func main () {
    err := Dir("./packages", "./app")
    if err != nil {
        println(err)
    }
}

I expected a result directory tree in app:
project
---app(where to copy)
------client01
---------build
------------main.go
------------config.json
------------someFolder
------test4
---------build

For instance, test4 and client01 copied because it has "build" child-folder, and it copies only build folder

But I got that result directory tree: project
---app
------process(that folder should not be copied)
---------client01
-----------build
--------------main.go
--------------config.json

  • 写回答

1条回答 默认 最新

  • 普通网友 2019-06-10 11:40
    关注

    So far i can tell, you only need to change this line : err := Dir("./packages", "./app") into : err := Dir("./packages/process", "./app")

    If you want something else, let it know. Because i am guessing what the real problem is.

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大