在go语言种实现复制目录 - 包括子目录和文件示例
Go  /  管理员 发布于 1年前   482
如何用Go复制目录的所有内容到另一个目录,复制过程将执行最低限度的正确性检查,并确保所有权限也被复制过来。
示例代码:
copydir.go
package main
 import (
   "os"
   "flag"
   "fmt"
   "io"
 )
 func CopyFile(source string, dest string) (err error) {
     sourcefile, err := os.Open(source)
     if err != nil {
         return err
     }
     defer sourcefile.Close()
     destfile, err := os.Create(dest)
     if err != nil {
         return err
     }
     defer destfile.Close()
     _, err = io.Copy(destfile, sourcefile)
     if err == nil {
         sourceinfo, err := os.Stat(source)
         if err != nil {
             err = os.Chmod(dest, sourceinfo.Mode())
         }
     }
     return
 }
 func CopyDir(source string, dest string) (err error) {
     // 获取源目录的属性
     sourceinfo, err := os.Stat(source)
     if err != nil {
         return err
     }
     // 创建目标目录
     err = os.MkdirAll(dest, sourceinfo.Mode())
     if err != nil {
         return err
     }
     directory, _ := os.Open(source)
     objects, err := directory.Readdir(-1)
     for _, obj := range objects {
         sourcefilepointer := source + "/" + obj.Name()
         destinationfilepointer := dest + "/" + obj.Name()
         if obj.IsDir() {
             // 创建子目录 - 递归
             err = CopyDir(sourcefilepointer, destinationfilepointer)
             if err != nil {
                 fmt.Println(err)
             }
         } else {
             // 进行复制
             err = CopyFile(sourcefilepointer, destinationfilepointer)
             if err != nil {
                 fmt.Println(err)
             }
         }
     }
     return
 }
 func main() {
   flag.Parse() // 获取源目录和目标目录
   source_dir := flag.Arg(0) // 从第一个参数中获取源目录
   dest_dir := flag.Arg(1) // 从第 2 个参数中获取目标目录
   fmt.Println("源 :" + source_dir)
   // 检查源目录是否存在
   src, err := os.Stat(source_dir)
   if err != nil {
      panic(err)
   }
   if !src.IsDir() {
     fmt.Println("源文件不是目录")
     os.Exit(1)
   }
   // 创建目标目录
   fmt.Println("目的地 :"+ dest_dir)
   _, err = os.Open(dest_dir)
   if !os.IsNotExist(err) {
     fmt.Println("目标目录已存在。终止!")
     os.Exit(1)
   }
   err = CopyDir(source_dir, dest_dir)
   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Println("复制的目录")
   }
 }输出:
通过执行以下来构建程序
>go build copydir.go 
并执行 
>/copydir /Users/admin/source_test /Users/admin/test源 :/Users/admin/source_test
目的地 :/Users/admin/test
复制的目录注意
我曾尝试使用 filepath.walk() 实现该功能,但在递归调用该函数时遇到了问题。
因此,在本文,将使用 readdir(-1)
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
			Copyright·© 2019 侯体宗版权所有·
			粤ICP备20027696号
			
			
