您的位置:首页 > 教程 > 其他脚本 > GO语言实现简单的目录复制功能

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

2019-11-10 09:10:27 来源:易采站长站 作者:丽君

GO语言实现简单的目录复制功能,遍历,文件,目录,复制,写入

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

易采站长站,站长之家为您整理了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 {以上就是关于对GO语言实现简单的目录复制功能的详细介绍。欢迎大家对GO语言实现简单的目录复制功能内容提出宝贵意见

相关文章

  • 使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    (1)业务复杂度介绍 开门见山,假设一个直播间同时500W人在线,那么1秒钟1000条弹幕,那么弹幕系统的推送频率就是: 500W * 1000条/秒=50亿条/秒 ,想想B站2019跨年晚会那次弹幕系统得是
    2020-07-08
  • golang中import cycle not allowed解决的一种思路

    golang中import cycle not allowed解决的一种思路

    发现问题 项目中碰到了一些问题,使用了指针函数的思路来解决相应问题 在实际项目中,因为两个项目互相引了对方的一些方法,导致了循环引用的错误,原本可以使用http的请求来解
    2019-11-10
  • 从go语言中找&和*区别详解

    从go语言中找&和*区别详解

    *和的区别 : 是取地址符号 , 即取得某个变量的地址 , 如 ; a*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 . 从
    2020-06-23
  • Go语言中利用http发起Get和Post请求的方法示例

    Go语言中利用http发起Get和Post请求的方法示例

    关于 HTTP 协议 HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信。 HTTP 的工作方式是客户机与服务器之间的 “请求-应答
    2019-11-10
  • golang如何实现mapreduce单进程版本详解

    golang如何实现mapreduce单进程版本详解

    前言 MapReduce作为hadoop的编程框架,是工程师最常接触的部分,也是除去了网络环境和集群配 置之外对整个Job执行效率影响很大的部分,所以很有必要深入了解整个过程。元旦放假的第一天
    2019-11-10
  • Go打包二进制文件的实现

    Go打包二进制文件的实现

    背景 众所周知,go语言可打包成目标平台二进制文件是其一大优势,如此go项目在服务器不需要配置go环境和依赖就可跑起来。 操作 需求:打包部署到centos7 笔者打包环境:mac os 方法:
    2020-03-11
  • GO语言实现简单的目录复制功能

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

    本文实例讲述了GO语言实现简单的目录复制功能。分享给大家供大家参考。具体实现方法如下: 创建一个独立的 goroutine 遍历文件,主进程负责写入数据。程序会复制空目录,也可以设
    2019-11-10
  • golang中定时器cpu使用率高的现象详析

    golang中定时器cpu使用率高的现象详析

    前言: 废话少说,上线一个用golang写的高频的任务派发系统,上线跑着很稳定,但有个缺点就是当没有任务的时候,cpu的消耗也在几个百分点。 平均值在3%左右的cpu使用率。你没有任务
    2019-11-10