io.copy在一个函数内为什么只能复制一次?

mike51 · 2017-02-23 02:55:52 · 4447 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-02-23 02:55:52 的主题,其中的信息可能已经有所发展或是发生改变。

请问大神,io.copy在一个函数内为什么只能复制一次?,第二次就不能复制过去了,看源码没看出来


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

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

4447 次点击  
加入收藏 微博
7 回复  |  直到 2017-02-24 09:41:31
polaris
polaris · #1 · 8年之前

你传入的 writerreader 是啥?试试执行下 Seek

mike51
mike51 · #2 · 8年之前
func main() {
    // Open a zip file for reading
    // 打开压缩文件包
    zr, err := zip.OpenReader(filepath.Join(
        "D:/","Go WorkSpace/src/a_golearning_library_of_everything/go-packages/archive/zip/reader", "archive.zip"))
    if err != nil {
        log.Fatalln(err)
    }
    // Close the archive when we're done
    // 压缩完成后关闭
    defer func() {
        if err := zr.Close(); err != nil {
            log.Fatalln(err)
        }
    }()

    // Iterate through the files in the archive
    // 循环逐个读取zip包内的文件
    for _, f := range zr.File {
        // Open the current file to read it's contents
        // 打开包内的文件
        rc, err := f.Open()
        if err != nil {
            log.Fatalln(err)
        }

        // Print the current file's name
        // 打印文件名
        //fmt.Printf("%s:\n", f.Name)

        // Copy the contents of the file to stdout
        // 把文件内容输出到打印台
        _, err = io.Copy(os.Stdout, rc)
        if err != nil {
            log.Fatalln(err)
        }

        fw,_:=os.Create(path.Join("D:/","Go WorkSpace/src/a_golearning_library_of_everything/go-packages/archive/zip/reader/",f.Name))
        _,err = io.Copy(fw,rc)
        // Close the file handle
        // 关闭文件
        if err := rc.Close(); err != nil {
            log.Fatalln(err)
        }

        fmt.Println("\n")
    }
}
mike51
mike51 · #3 · 8年之前
polarispolaris #1 回复

你传入的 `writer` 和 `reader` 是啥?试试执行下 `Seek `?

seek是什么意思

polaris
polaris · #4 · 8年之前

看了下 zip 包,没有实现 io.Seek 接口,所以,我说的不行。因为流读到末尾了,你接着 Copy,自然啥也 Copy 不到,如果实现了 Seek 接口,可以重置到流的开始。

mike51
mike51 · #5 · 8年之前

多谢

yufeng
yufeng · #6 · 8年之前

不用zip 去实现Seek接口,直接rc.Seek(0,0)回到起始位置

polaris
polaris · #7 · 8年之前
yufengyufeng #6 回复

不用zip 去实现Seek接口,直接rc.Seek(0,0)回到起始位置

这里 rc 根本没有 Seek 方法啊

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传