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((将擦除文件内容,输出为:
[]
Copy(dst Writer,src Reader(从src复制到dst,它将擦除src内容。有吗有什么方法可以避免擦除?
io.Copy(fileTo, file)
将擦除文件内容
不会的。但它将把读取位置移动到EOF
,这意味着下一个ioutil.ReadAll()
将从…开始。。。EOF
。
您可以在ioutil.ReadAll()
之前关闭它并重新打开"file
"。
顺便说一下,您有两个defer file.Close()
实例:第二个实例应该是defer fileTo.Close()
或者,更简单的是,按照PeterSO的回答,用SectionReader.Seek()
重置它。
_, err = file.Seek(0, io.SeekStart)
它也在GoByExamples Reading Files中进行了说明:
没有内置的倒带,但
Seek(0, 0)
可以实现这一点。
(os.SEEK_SET
在os常量中定义为0
(
const SEEK_SET int = 0 // seek relative to the origin of the file
现在(2020(已弃用,取而代之的是io.SeekStart
另见";Golang,一个适当的方式倒带文件指针";。
使用查找从文件结尾重置到文件开头。例如
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]