小白求助:使用协程拷贝文件时遇到的问题

LuLu · · 805 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

我试图在主线程中读取一个图片文件,每次读写1024*4大小的buf,然后将读取的内容和当前读取的起点位置包装成一个job对象,然后开启一个goroutine,通过管道来获取主线程每次读取的job对象,然后将内容写到一个新的文件中,以达到拷贝该图片的效果。但是不知道为何无法实现。下面给出我的代码。![image.png] ![1.png](https://static.studygolang.com/220317/ea7745ec422938841169504f7362319e.png) ![2.png](https://static.studygolang.com/220317/2ff14566b633609434ff78508f97abcf.png) ![3.png](https://static.studygolang.com/220317/7541c28e1bbc857a8d7cb1b23a76cf87.png) ![4.png](https://static.studygolang.com/220317/c5dadc8dc85da8cc86f74af3d25c056c.png) ![5.png](https://static.studygolang.com/220317/30ec04433adb06c902a08c1ba5d7e52e.png) package main import ( "bufio" "fmt" "io" "os" ) type job struct { buf []byte index int64 } func newJob(buf []byte, index int64) *job { return &job{ buf: buf, index: index, } } func copyFile(writer *bufio.Writer, jobChan <-chan *job, done chan bool) { for newJob := range jobChan { n, err := writer.Write(newJob.buf) if err != nil { fmt.Printf("write file failed,err:%v\n", err) return } err = writer.Flush() if err != nil { fmt.Printf("flush file failed,err:%v\n", err) return } fmt.Printf("begin:%v,write success %v\n", newJob.index, n) //done <- true } done <- true } func main() { srcFile, err := os.Open("./girl.jpg") if err != nil { fmt.Printf("open srcFile failed,err:%v\n", err) return } dstFile, err := os.OpenFile("./girl_bak.jpg", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777) if err != nil { fmt.Printf("open dstFile failed,err:%v\n", err) return } defer srcFile.Close() defer dstFile.Close() reader := bufio.NewReader(srcFile) writer := bufio.NewWriter(dstFile) done := make(chan bool) Buf := make([]byte, 1024) total := int64(0) jobChan := make(chan *job) go copyFile(writer, jobChan, done) for { n, err := reader.Read(Buf) if err == io.EOF { fmt.Printf("read file finish\n") break } if err != nil { fmt.Printf("read file failed.err:%v\n", err) return } newJob := newJob(Buf[:n], total) jobChan <- newJob total += int64(n) } close(jobChan) <-done }

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

805 次点击  
加入收藏 微博
3 回复  |  直到 2022-03-23 21:05:37
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传