有什么简单/快速的方法可以在 Go 中复制文件吗?
我在文档中找不到快速方法,搜索互联网也无济于事。
原文由 herb 发布,翻译遵循 CC BY-SA 4.0 许可协议
import (
"io/ioutil"
"log"
)
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func copy(src string, dst string) {
// Read all content of src to data, may cause OOM for a large file.
data, err := ioutil.ReadFile(src)
checkErr(err)
// Write data to dst
err = ioutil.WriteFile(dst, data, 0644)
checkErr(err)
}
原文由 haosdent 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
6 回答6.8k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答3.3k 阅读
2 回答920 阅读✓ 已解决
2 回答2.2k 阅读
1 回答2.2k 阅读
一个 健壮 而 高效 的副本在概念上很简单,但由于需要处理目标操作系统及其配置强加的许多边缘情况和系统限制,因此实施起来并不简单。
如果您只想复制现有文件,可以使用
os.Link(srcName, dstName)
。这避免了在应用程序中移动字节并节省磁盘空间。对于大文件,这可以显着节省时间和空间。但是各种操作系统对硬链接的工作方式有不同的限制。根据您的应用程序和目标系统配置,
Link()
调用可能并非在所有情况下都有效。如果你想要一个单一的通用、健壮和高效的复制功能,
Copy()
更新为:os.SameFile
检查两个文件是否已经存在并且相同,如果相同则返回成功一种优化方法是在 go 例程中复制字节,这样调用者就不会阻塞字节复制。这样做会给调用者带来额外的复杂性,以正确处理成功/错误情况。
如果我想要两者,我将有两个不同的复制函数:
CopyFile(src, dst string) (error)
用于阻塞复制和CopyFileAsync(src, dst string) (chan c, error)
将信号通道传递回异步情况下的调用者。