• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Golang > GO语言实现简单的目录复制功能

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

作者:shichen2014 字体:[增加 减小] 来源:互联网

shichen2014 通过本文主要向大家介绍了go语言,go语言环境搭建,go语言程序设计,let it go 25种语言,go语言教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

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

代码如下:
// 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)
}</div>

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

</div>

您可能想查找下面的文章:

  • 利用Go语言搭建WebSocket服务端方法示例
  • Go语言字典(map)用法实例分析【创建,填充,遍历,查找,修改,删除】
  • Go语言中更优雅的错误处理
  • Go语言实现的排列组合问题实例(n个数中取m个)
  • Go语言Cookie用法分析
  • GO语言运行环境下载、安装、配置图文教程
  • go语言文件正则表达式搜索功能示例
  • Go语言正则表达式用法实例小结【查找、匹配、替换等】
  • Go语言正则表达式示例
  • Go语言中三种不同md5计算方式的性能比较

相关文章

  • go语言日志记录库简单使用方法实例分析
  • Go语言执行系统命令行命令的方法
  • Go语言中的内存布局详解
  • Go语言流程控制之goto语句与无限循环
  • Go语言图片处理和生成缩略图的方法
  • 总结Go语言中defer的使用和注意要点
  • GOLANG版的冒泡排序和快速排序分享
  • go语言环境搭建简述
  • Go语言中的switch用法实例分析
  • Go语言MD5加密用法实例

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • go语言base64加密解密的方法
    • Windows环境下vscode-go安装笔记(不支持32位)
    • 初步解读Golang中的接口相关编写方法
    • Golang算法问题之整数拆分实现方法分析
    • golang操作mongodb的方法
    • Go语言计算两个经度和纬度之间距离的方法
    • Golang学习笔记(一):简介
    • Go语言中new()和 make()的区别详解
    • 简介Go语言中的select语句的用法
    • Go语言共享内存读写实例分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有