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内容。在那儿 有什么方法可以避免擦除?
答案 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_SET
在os 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]