源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-01-29 15:51 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:GO语言实现简单的目录复制功能
本文实例讲述了GO语言实现简单的目录复制功能。分享给大家供大家参考。具体实现方法如下: 创建一个独立的 goroutine 遍历文件,主进程负责写入数据。程序会复制空目录,也可以设置只复制以 ".xx" 结尾的文件。 严格来说这不是复制文件,而是写入新文件。因为这个程序是创建新文件,然后写入复制数据的。我们一般的 copy 命令是不会修改文件的 ctime(change time) 状态的。 [img]http://files.jb51.net/file_images/article/201412/2014123152927793.jpg?2014113152946[/img] 代码如下:
[u]复制代码[/u] 代码如下:
// 一个简单的目录复制程序:一个独立的 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语言程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部