使用os和io包可实现Golang文件复制,首先打开源文件并创建目标文件,通过io.Copy传输数据,并确保关闭文件。示例代码包含普通复制、带缓冲区优化及保留权限的复制方式,其中copyFileWithMode函数利用os.OpenFile传递源文件mode以保持权限,整个过程需注意错误处理与资源释放。

在Golang中实现文件复制功能,可以通过标准库 os 和 io 包完成。最常见的方式是使用 io.Copy 函数,结合文件的打开与关闭操作,安全高效地完成复制任务。
使用 os.Open 打开源文件,用 os.Create 创建目标文件,再通过 io.Copy 将数据从源复制到目标。操作完成后记得关闭文件以释放资源。
示例代码:
func copyFile(src, dst string) error {
sourceFile, err := os.Open(src)
if err != nil {
return err
}
defer sourceFile.Close()
destinationFile, err := os.Create(dst)
if err != nil {
return err
}
defer destinationFile.Close()
_, err = io.Copy(destinationFile, sourceFile)
return err
}
默认的 io.Copy 已经使用内部缓冲,但你可以手动指定缓冲区大小来控制内存使用或提升特定场景下的性能,比如处理大文件时。
立即学习“go语言免费学习笔记(深入)”;
使用 io.CopyBuffer 可自定义缓冲区:
buf := make([]byte, 32*1024) // 32KB 缓冲区 _, err = io.CopyBuffer(destinationFile, sourceFile, buf)
如果希望目标文件保持源文件的权限(如可执行权限),可以在创建目标文件时传入源文件的 file mode。
获取源文件信息:
sourceInfo, err := os.Stat(src)
if err != nil {
return err
}
destinationFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, sourceInfo.Mode())
func copyFileWithMode(src, dst string) error {
source, err := os.Open(src)
if err != nil {
return err
}
defer source.Close()
sourceInfo, err := source.Stat()
if err != nil {
return err
}
destination, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, sourceInfo.Mode())
if err != nil {
return err
}
defer destination.Close()
_, err = io.Copy(destination, source)
return err
}
基本上就这些。Golang的标准库已经提供了足够简洁且可靠的方式来实现文件复制,不需要依赖外部包。只要注意错误处理和资源释放,就能写出健壮的文件操作代码。
以上就是如何在Golang中实现文件复制功能的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号