• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    GO语言实现简单的目录复制功能

    本文实例讲述了GO语言实现简单的目录复制功能。分享给大家供大家参考。具体实现方法如下:

    创建一个独立的 goroutine 遍历文件,主进程负责写入数据。程序会复制空目录,也可以设置只复制以 ".xx" 结尾的文件。
    严格来说这不是复制文件,而是写入新文件。因为这个程序是创建新文件,然后写入复制数据的。我们一般的 copy 命令是不会修改文件的 ctime(change time) 状态的。

    代码如下:

    复制代码 代码如下:
    // 一个简单的目录复制程序:一个独立的 goroutine 遍历目录,主进程负责将数据写入新目录。
    // 2014-11-02 Bing.L
    package main

    import (
     "io"
     "log"
     "os"
     "path/filepath"
     "strings"
    )

    type FileInfo struct {
     RelPath string
     Size    int64
     IsDir   bool
     Handle  *os.File
    }

    //复制文件数据
    func ioCopy(srcHandle *os.File, dstPth string) (err error) {
     dstHandle, err := os.OpenFile(dstPth, os.O_CREATE|os.O_WRONLY, os.ModePerm)
     if err != nil {
      return err
     }

     defer srcHandle.Close()
     defer dstHandle.Close()

     _, err = io.Copy(dstHandle, srcHandle)
     return err
    }

    //遍历目录,将文件信息传入通道
    func WalkFiles(srcDir, suffix string, c chan- *FileInfo) {
     suffix = strings.ToUpper(suffix)

     filepath.Walk(srcDir, func(f string, fi os.FileInfo, err error) error { //遍历目录
      if err != nil {
       log.Println("[E]", err)
      }

      fileInfo := FileInfo{}
      if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) { //匹配文件
       if fh, err := os.OpenFile(f, os.O_RDONLY, os.ModePerm); err != nil {
        log.Println("[E]", err)
       } else {
        fileInfo.Handle = fh
        fileInfo.RelPath, _ = filepath.Rel(srcDir, f) //相对路径
        fileInfo.Size = fi.Size()
        fileInfo.IsDir = fi.IsDir()
       }

       c - fileInfo
      }
     })
     close(c) //遍历完成,关闭通道
    }

    //写目标文件
    func WriteFiles(dstDir string, c -chan *FileInfo) {
     if err := os.Chdir(dstDir); err != nil { //切换工作路径
      log.Fatalln("[F]", err)
     }

     for f := range c {
      if fi, err := os.Stat(f.RelPath); os.IsNotExist(err) { //目标不存在
       if f.IsDir {
        if err := os.MkdirAll(f.RelPath, os.ModeDir); err != nil {
         log.Println("[E]", err)
        }
       } else {
        if err := ioCopy(f.Handle, f.RelPath); err != nil {
         log.Println("[E]", err)
        } else {
         log.Println("[I] CP:", f.RelPath)
        }
       }
      } else if !f.IsDir { //目标存在,而且源不是一个目录

       if fi.IsDir() != f.IsDir { //检查文件名被目录名占用冲突
        log.Println("[E]", "filename conflict:", f.RelPath)

       } else if fi.Size() != f.Size { //源和目标的大小不一致时才重写
        if err := ioCopy(f.Handle, f.RelPath); err != nil {
         log.Println("[E]", err)
        } else {
         log.Println("[I] CP:", f.RelPath)
        }
       }
      }
     }
    }

    func main() {
     files_ch := make(chan *FileInfo, 100)

     go WalkFiles("E:\\study", ".doc", files_ch) //在一个独立的 goroutine 中遍历文件
     WriteFiles("E:\\study.bak", files_ch)
    }

    希望本文所述对大家的GO语言程序设计有所帮助。

    您可能感兴趣的文章:
    • golang实现简易的分布式系统方法
    • Go语言实现互斥锁、随机数、time、List
    • Golang获取当前时间代码
    • Golang字符串的拼接方法汇总
    • Go语言中 Channel 详解
    • go语言中strings包的用法汇总
    • Golang中的变量学习小结
    • Golang中的自定义函数详解
    • 在Go中复制文件最流行的3种方法
    上一篇:GO语言异常处理机制panic和recover分析
    下一篇:GO语言文件的创建与打开实例分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    GO语言实现简单的目录复制功能 语言,实现,简单,的,目录,