在使用Go开发项目的过程中,有时我们需要做一些复制文件的功能,我们可以把它封装成一个函数,在以后每次需要用到该功能的时候直接调用封装的函数即可。

如果是大文件,我们可以使用os包,使用os.Open()os.Create()都可以获取到文件句柄(文件指针),然后通过文件句柄(文件指针)的Read()Write()方法,按照字节读取和写入来实现复制文件的功能

对于大文件,我们可以采用下面的方式

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "os"
  6. )
  7. func CopyFile(srcFileName string, dstFileName string) {
  8. //打开源文件
  9. srcFile, err := os.Open(srcFileName)
  10. if err != nil {
  11. log.Fatalf("源文件读取失败,原因是:%v\n", err)
  12. }
  13. defer func() {
  14. err = srcFile.Close()
  15. if err != nil {
  16. log.Fatalf("源文件关闭失败,原因是:%v\n", err)
  17. }
  18. }()
  19. //创建目标文件,稍后会向这个目标文件写入拷贝内容
  20. distFile, err := os.Create(dstFileName)
  21. if err != nil {
  22. log.Fatalf("目标文件创建失败,原因是:%v\n", err)
  23. }
  24. defer func() {
  25. err = distFile.Close()
  26. if err != nil {
  27. log.Fatalf("目标文件关闭失败,原因是:%v\n", err)
  28. }
  29. }()
  30. //定义指定长度的字节切片,每次最多读取指定长度
  31. var tmp = make([]byte, 1024*4)
  32. //循环读取并写入
  33. for {
  34. n, err := srcFile.Read(tmp)
  35. n, _ = distFile.Write(tmp[:n])
  36. if err != nil {
  37. if err == io.EOF {//读到了文件末尾,并且写入完毕,任务完成返回(关闭文件的操作由defer来完成)
  38. return
  39. } else {
  40. log.Fatalf("拷贝过程中发生错误,错误原因为:%v\n", err)
  41. }
  42. }
  43. }
  44. }
  45. func main() {
  46. CopyFile("./worm.mp4", "./dist.mp4")
  47. }

使用io包的Copy方法也能实现文件复制功能

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. )
  7. //自己编写一个函数,接收两个文件路径 srcFileName dstFileName
  8. func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
  9. srcFile, err := os.Open(srcFileName)
  10. if err != nil {
  11. fmt.Printf("open file err = %v\n", err)
  12. return
  13. }
  14. defer srcFile.Close()
  15. //打开dstFileName
  16. dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0755)
  17. if err != nil {
  18. fmt.Printf("open file err = %v\n", err)
  19. return
  20. }
  21. defer dstFile.Close()
  22. return io.Copy(dstFile, srcFile)
  23. }
  24. func main() {
  25. result, err := CopyFile("./src/main/dst.png", "./src/main/file.png")
  26. if err == nil {
  27. fmt.Println("拷贝成功!,拷贝的字节数为: ", result)
  28. }
  29. }

还可以使用下面的方法

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. //自己编写一个函数,接收两个文件路径 srcFileName dstFileName
  9. func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
  10. srcFile, err := os.Open(srcFileName)
  11. if err != nil {
  12. fmt.Printf("open file err = %v\n", err)
  13. return
  14. }
  15. defer srcFile.Close()
  16. //通过srcFile,获取到Reader
  17. reader := bufio.NewReader(srcFile)
  18. //打开dstFileName
  19. dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)
  20. if err != nil {
  21. fmt.Printf("open file err = %v\n", err)
  22. return
  23. }
  24. writer := bufio.NewWriter(dstFile)
  25. defer func() {
  26. writer.Flush() //把缓冲区的内容写入到文件
  27. dstFile.Close()
  28. }()
  29. return io.Copy(writer, reader)
  30. }
  31. func main() {
  32. result, err := CopyFile("./src/main/dst.png", "./src/main/file.png")
  33. if err == nil {
  34. fmt.Println("拷贝成功!拷贝的字节大写为: ", result)
  35. }
  36. }

Go语言复制文件的更多相关文章

  1. C语言复制文件的两种简单的方法【从根本解决问题】

    网上的方法大致有这样几种: 1.使用操作系统提供的复制文件的API 2.使用C语言本身提供的复制文件的函数 3.直接读写文件,从文件角度来操作,从而直接将一个文件复制 这里我们使用的就是这第三种. 复 ...

  2. Linux下C语言复制文件

    从usr/bin/info复制到myinfo.c #include<unistd.h> #include<fcntl.h> #include<sys/types.h> ...

  3. c语言复制文件程序

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 1024*1024* ...

  4. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_4_缓冲流的效率测试_复制文件

    把之前文件复制的代码复制到这里 一个字节一个字节的读取,复制文件 byte数组的形式 缓冲流测试 数组缓冲

  5. C 语言 .h文件的作用

    C语言头文件的作用 最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的 ...

  6. 嵌入式C语言头文件的建立与使用

    如何正确编写 C 语言头文件和与之相关联的 c 源程序文件,这首先就要了解它们的各自功能. 要理解 C 文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程. 一般说来编译器会做以下几 ...

  7. C语言头文件

    最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比 ...

  8. R语言进行文件夹操作示例(转)

    rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A& ...

  9. C语言头文件、库文件的查找路径

    在 程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用.这样,可避免在每个 ...

随机推荐

  1. Zookeeper使用--命令行

    一.前言 在学习了Zookeeper相关的理论知识后,下面接着学习对Zookeeper的相关操作. 二.Zookeeper部署 Zookeeper的部署相对来说还是比较简单. Zookeeper有三种 ...

  2. python 聊天程序(基于UDP)

    from threading import Thread from socket import * updSocket = socket(AF_INET,SOCK_DGRAM) updSocket.b ...

  3. pycharm 有些模块没有提示 解决方法

    解决方法:右键模块所在文件夹,选择make directory as ,选择excluded或者sources root,即可.

  4. 除非你是BAT,前端开发中最好少造轮子

    站在前人的肩膀上 HTML.CSS.JavaScript是前端的根基,这是无可否认的事实.正如一辆车当然都是由一堆钢板和螺钉组成的,但是现在还有人拎着个锤子敲敲打打的造车吗?李书福说过,“汽车不过是四 ...

  5. Spring in Action 第一章 Spring之旅

    1.1 简化Java开发 1.1.2 依赖注入(DI) 松耦合:如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能在对象本身毫不知情的情况下,用不同的具体实现进行替代 ...

  6. map和list循环遍历

    //map遍历(zmm是实体类) Map<String, zmm> maps = new HashMap<String, zmm>(); //给map存值: maps.put( ...

  7. jquery datatables+MVC+WCF

    view @{ Layout = null;} <!DOCTYPE html><html><head> <title>111</title> ...

  8. windows2012 raid架构 忘记系统管理员密码的解决方法

    1. http://bbs.51cto.com/thread-939710-1.html 2. https://wenku.baidu.com/view/115783cd0b4e767f5acfcef ...

  9. mysqlGTID主从配置

    GTID主从简介 GTID是基于mysql生成的事务ID,由服务器ID和事务ID组成. 这个ID在主库及从库上都是唯一的. 这个特性可以让mysql的主从复制变得更加简单,一致性更加可靠. GTID优 ...

  10. Windows上Kafka运行环境安装

    1. 安装JDK 1.1 安装文件:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK1.2 安装完成后需 ...