【Go语言快速上手】文件操作&协程操作
warning:
这篇文章距离上次修改已过183天,其中的内容可能已经有所变动。
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"time"
)
// 定义一个获取指定目录下所有文件的函数
func getAllFiles(dirPth string) (files []string, err error) {
dir, err := ioutil.ReadDir(dirPth)
if err != nil {
return nil, err
}
PthSep := string(os.PathSeparator)
for _, fi := range dir {
if fi.IsDir() { // 判断是否是目录
dir1 := dirPth + PthSep + fi.Name()
tmp, err := getAllFiles(dir1)
if err != nil {
return nil, err
}
files = append(files, tmp...)
} else {
files = append(files, dirPth+PthSep+fi.Name())
}
}
return files, nil
}
// 定义一个使用协程进行文件复制的函数
func copyFile(src, dest string, c chan string) {
data, err := ioutil.ReadFile(src)
if err != nil {
fmt.Println(err)
c <- err.Error()
return
}
err = ioutil.WriteFile(dest, data, 0644)
if err != nil {
fmt.Println(err)
c <- err.Error()
return
}
newName := filepath.Base(dest)
c <- "成功复制文件: " + newName
}
func main() {
// 获取所有文件示例
files, err := getAllFiles("./")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("所有文件:", files)
// 使用协程复制文件示例
copyChan := make(chan string, 10)
go copyFile("source.txt", "dest.txt", copyChan)
fmt.Println(<-copyChan)
// 使用time.Sleep等待协程完成操作
time.Sleep(1 * time.Second)
}
这段代码首先定义了一个递归获取指定目录下所有文件的函数getAllFiles
,然后定义了一个使用协程进行文件复制的函数copyFile
。在main
函数中,我们演示了如何使用这两个函数,并通过time.Sleep
确保协程完成操作后再退出程序。这样的实践可以防止主程序在协程完成前就退出,确保协程能够正常执行。
评论已关闭