io.Copy()删除Reader内容

时间:2014-04-24 05:46:19

标签: go

    package main

    import (
        "fmt"
        "io"
        "io/ioutil"
        "os"
    )

    func main() {
        file, err := os.Open("HelloWorld")
        if nil != err {
            fmt.Println(err)
        }
        defer file.Close()

        fileTo, err := os.Create("fileTo")
        if nil != err {
            fmt.Println(err)
        }
        defer file.Close()

        _, err = io.Copy(fileTo, file)
        if nil != err {
            fmt.Println(err)
        }

        fileByteOne, err := ioutil.ReadAll(file)
        if nil != err {
            fmt.Println(err)
        }

        fmt.Println(fileByteOne)
    }

io.Copy()将删除文件内容,输出为:

[]

复制(dst Writer,src Reader)从src复制到dst,它将擦除src内容。在那儿 有什么方法可以避免擦除?

2 个答案:

答案 0 :(得分:4)

  

io.Copy(fileTo, file)将删除文件内容

它没有赢。但它会将阅读位置移至EOF,这意味着下一个ioutil.ReadAll()将从... EOF开始。

您可以关闭它并在file之前重新打开ioutil.ReadAll()

顺便提一下,您有两个defer file.Close()个实例:第二个实例应为defer fileTo.Close() 或者,更简单一点,根据SectionReader.Seek() PeterSO的建议,使用answer重置它。

 _, err = file.Seek(0, os.SEEK_SET)

GoByExamples Reading Files中也说明了这一点:

  

没有内置倒带,但Seek(0, 0)可以完成此操作。

os.SEEK_SETos constants中定义为0

const SEEK_SET int = 0 // seek relative to the origin of the file

答案 1 :(得分:2)

使用搜索从文件末尾重置到文件的开头。例如。

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
)

func main() {
    file, err := os.Open("HelloWorld")
    if err != nil {
        fmt.Println(err)
    }
    defer file.Close()

    fileTo, err := os.Create("fileTo")
    if err != nil {
        fmt.Println(err)
    }
    defer fileTo.Close()

    _, err = io.Copy(fileTo, file)
    if err != nil {
        fmt.Println(err)
    }

    _, err = file.Seek(0, os.SEEK_SET) // start of file
    if err != nil {
        fmt.Println(err)
    }
    fileByteOne, err := ioutil.ReadAll(file)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(fileByteOne)
}

输出:

[72 101 108 108 111 44 32 87 111 114 108 100 33 10]