解决Golang调用完io.Copy()方法之后再次调用后内容为空的问题

昨天在写文件上传的时候,遇到了个问题:调用io.Copy()之后,保存在我本地的新文件的内容是空的。排查了很久,发现问题出在我调用io.Copy()将文件内容保存在新文件之前,进行了一次求文件hash值的操作,而这个操作也执行了一次io.Copy(),从而导致第二次的io.Copy()读取到的内容为空了。

这里简单写个demo来复现一下:

func main() {
	file, err := os.Open("example.txt")
	if err != nil {
		log.Fatal(err)
	}
	//读取文件内容
	content, _ := ioutil.ReadAll(file)
	fmt.Println("第一次读取的文件内容:", string(content))
	defer file.Close()
	dest, err := os.Create("example_copy.txt")
	if err != nil {
		log.Fatal(err)
	}
	//将example.txt的文件内容复制到example_copy.txt文件中
	io.Copy(dest, file)
	content, _ = ioutil.ReadAll(file)
	fmt.Println("第二次读取的文件内容:", string(content))
}

运行结果如下:

可以看到,在第二次打印文件内容时,文件内容为空了

为什么会这样呢?

查找资料后发现原因是因为io.Copy()方法读取文件内容的时候,会移动文件指针。而在调用完io.Copy()方法之后,文件指针是被移到文件的末尾处的,所以在第二次读取文件文件的内容为空。

解决方法也很简单,就是在第二次调用之前把文件指针移到开头即可,调用file.Seek()方法即可实现

func main() {
	file, err := os.Open("example.txt")
	if err != nil {
		log.Fatal(err)
	}
	//读取文件内容
	content, _ := ioutil.ReadAll(file)
	fmt.Println("第一次读取的文件内容:", string(content))
	defer file.Close()
	dest, err := os.Create("example_copy.txt")
	if err != nil {
		log.Fatal(err)
	}
	//将example.txt的文件内容复制到example_copy.txt文件中
	io.Copy(dest, file)
	file.Seek(0, 0) //将文件指针移到文件开头
	content, _ = ioutil.ReadAll(file)
	fmt.Println("第二次读取的文件内容:", string(content))
}

可以看到,现在第二次读取的文件内容就和第一次的一样啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值