在go语言种实现复制目录 - 包括子目录和文件示例
Go  /  管理员 发布于 1年前   308
如何用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号