当前位置: 首页 > news >正文

Golang实现文件复制

方法:三种

package zdpgo_fileimport ("errors""io""os"
)// CopyFile 使用io.Copy进行文件的复制,同时也会复制文件的所有权限
// @param src 复制文件
// @param des 目标文件
// @return error 错误信息
func CopyFile(src, des string) error {// 判断文件是否存在if !IsExist(src) {return errors.New("要复制的文件不存在")}// 打开文件srcFile, err := os.Open(src)if err != nil {return err}defer srcFile.Close()// 获取源文件的权限fi, _ := srcFile.Stat()perm := fi.Mode()// 创建目标文件,并复制源文件的所有权限desFile, err := os.OpenFile(des, os.O_RDWR|os.O_CREATE|os.O_TRUNC, perm)if err != nil {return err}defer desFile.Close()// 进行复制_, err = io.Copy(desFile, srcFile)// 返回return err
}// CopyFileByWriteFile 使用ioutil.WriteFile()和ioutil.ReadFile()
// @param src 复制文件
// @param des 目标文件
// @return error 错误信息
func CopyFileByWriteFile(src, des string) error {if !IsExist(src) {return errors.New("要复制的文件不存在")}// 获取源文件的权限srcFile, err := os.Open(src)if err != nil {return err}fi, _ := srcFile.Stat()perm := fi.Mode()defer srcFile.Close()// 读取文件input, err := os.ReadFile(src)if err != nil {return err}// 将源文件的内容和权限写入创建的文件err = os.WriteFile(des, input, perm)if err != nil {return err}// 返回return nil
}// CopyFileByWriteBuffer 使用os.Read()和os.Write()
// @param src 复制文件
// @param des 目标文件
// @param bufSize 缓冲区大小,小于或者等于0的时候,会使用默认1M的缓冲区大小
// @return error 错误信息
func CopyFileByWriteBuffer(src, des string, bufSize int) error {// 设置缓冲区大小if bufSize <= 0 {bufSize = 1 * 1024 * 1024 //1M}// 构造缓冲区buf := make([]byte, bufSize)// 打开文件srcFile, err := os.Open(src)if err != nil {return err}defer srcFile.Close()// 获取源文件的权限fi, _ := srcFile.Stat()perm := fi.Mode()// 创建目标文件并写入复制的权限desFile, err := os.OpenFile(des, os.O_CREATE|os.O_RDWR|os.O_TRUNC, perm)if err != nil {return err}defer desFile.Close()// 进行缓冲写入var n intfor {n, err = srcFile.Read(buf)if err != nil && err != io.EOF {return err}if n == 0 {break}if _, err = desFile.Write(buf[:n]); err != nil {return err}}// 返回return nil
}

测试

package zdpgo_fileimport "testing"func TestCopyFile(t *testing.T) {if err := AddDir("test"); err != nil {t.Fatal(err)}data1 := []struct {Src stringDst string}{{"copy_file.go", "test/test1.go"},{"copy_file.go", "test/test2.go"},{"copy_file.go", "test/test3.go"},}for _, tt := range data1 {v := CopyFile(tt.Src, tt.Dst)if v != nil {t.Error(v)}}data2 := []struct {Src stringDst string}{{"copy_file.go", "test/test11.go"},{"copy_file.go", "test/test22.go"},{"copy_file.go", "test/test33.go"},}for _, tt := range data2 {v := CopyFileByWriteFile(tt.Src, tt.Dst)if v != nil {t.Error(v)}}data3 := []struct {Src stringDst string}{{"copy_file.go", "test/test111.go"},{"copy_file.go", "test/test222.go"},{"copy_file.go", "test/test333.go"},}for _, tt := range data3 {v := CopyFileByWriteBuffer(tt.Src, tt.Dst, 0)if v != nil {t.Error(v)}}
}

测试结果

在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/358406.html

相关文章:

  • 探秘SpringBoot默认线程池:了解其运行原理与工作方式(@Async和ThreadPoolTaskExecutor)
  • kubernetes(Jenkins、kubernetes核心、K8s实战-KubeSphere、)
  • 国际数字影像产业园|科技与文创产品创意集市,共筑创新文化新高地
  • leetcode-55 跳跃游戏
  • Vue——计算属性 computed 与方法 methods 区别探究
  • Java中的ORM框架——myBatis
  • vue2生命周期和计算属性
  • Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发
  • centos8stream 编译安装 php-rabbit-mq模块
  • 「异步魔法:Python数据库交互的革命」(二)
  • php正则中的i,m,s,x,e分别表示什么
  • 最新!2023年台湾10米DEM地形瓦片数据
  • 网络学习(11) |深入解析客户端缓存与服务器缓存:HTTP缓存控制头字段及优化实践
  • uniapp中二次封装jssdk和使用
  • 只刷题可以通过PMP考试吗?
  • Python Selenium 详解:实现高效的UI自动化测试
  • npm获取yarn在安装依赖时 git://github.com/user/xx.git 无法访问解决方法 -- 使用 insteadOf设置git命令别名
  • Centos7网络故障,开机之后连不上网ens33mtu 1500 qdisc noop state DOWN group default qlen 1000
  • 分析 Base64 编码和 URL 安全 Base64 编码
  • cocos 屏幕点击坐标转换为节点坐标
  • 电瓶车进电梯识别报警摄像机
  • 数据库到服务器提权
  • 【MySQL精通之路】InnoDB(9)-表和页压缩(1)-表压缩
  • 【前端】vue+element项目中select下拉框label想要显示多个值多个字段
  • 橙派探险记:开箱香橙派 AIpro 与疲劳驾驶检测的奇幻之旅
  • 云计算期末复习(1)
  • frp转发服务
  • 【主流分布式算法总结】
  • spring cloud config server源码学习(一)
  • 人脸识别——探索戴口罩对人脸识别算法的影响