本文实例讲述了GO语言实现简单的目录复制功能。分享给大家供大家参考。具体实现方法如下:
创建一个独立的 goroutine 遍历文件,主进程负责写入数据。程序会复制空目录,也可以设置只复制以 ".xx" 结尾的文件。
严格来说这不是复制文件,而是写入新文件。因为这个程序是创建新文件,然后写入复制数据的。我们一般的 copy 命令是不会修改文件的 ctime(change time) 状态的。
代码如下:
// 一个简单的目录复制程序:一个独立的 goroutine 遍历目录,主进程负责将数据写入新目录。 // 2014-11-02 Bing.L package mainimport ( "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语言程序设计有所帮助。
本文向大家介绍Go语言实现简单留言板的方法,包括了Go语言实现简单留言板的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言实现简单留言板的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。
本文向大家介绍go语言实现简单http服务的方法,包括了go语言实现简单http服务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言实现简单http服务的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。
本文向大家介绍GO语言实现列出目录和遍历目录的方法,包括了GO语言实现列出目录和遍历目录的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了GO语言实现列出目录和遍历目录的方法。分享给大家供大家参考。具体如下: GO语言获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法课参考本文示例。 具体示例代码如下: 希望本文所述对大家的GO语言程
本文向大家介绍Go语言实现简单Web服务器的方法,包括了Go语言实现简单Web服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言实现简单Web服务器的方法。分享给大家供大家参考。具体分析如下: 包 http 通过任何实现了 http.Handler 的值来响应 HTTP 请求: package http type Handler interface { ServeHTTP
本文向大家介绍Go语言实现的一个简单Web服务器,包括了Go语言实现的一个简单Web服务器的使用技巧和注意事项,需要的朋友参考一下 Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,模版,cookie等数据进行设置和操作。 http包建立Web服务器 上
主要内容:Go语言工程结构简单,Go语言编译速度快Go语言语法简单易懂,学习曲线平缓,不需要像 C/ C++ 语言动辄需要两到三年的学习期。Go语言被称为“互联网时代的C语言”。互联网的短、频、快特性在Go语言中体现得淋漓尽致。一个熟练的开发者只需要短短的一周时间就可以从学习阶段转到开发阶段,并完成一个高并发的服务器开发。 Go语言是 Google 公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。所以它是一门类型安全的语言,加上通过构