zoukankan      html  css  js  c++  java
  • Go语言复制文件

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

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

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

    package main
    
    import (
    	"io"
    	"log"
    	"os"
    )
    
    func CopyFile(srcFileName string, dstFileName string) {
    	//打开源文件
    	srcFile, err := os.Open(srcFileName)
    	if err != nil {
    		log.Fatalf("源文件读取失败,原因是:%v
    ", err)
    	}
    	defer func() {
    		err = srcFile.Close()
    		if err != nil {
    			log.Fatalf("源文件关闭失败,原因是:%v
    ", err)
    		}
    	}()
    
    	//创建目标文件,稍后会向这个目标文件写入拷贝内容
    	distFile, err := os.Create(dstFileName)
    	if err != nil {
    		log.Fatalf("目标文件创建失败,原因是:%v
    ", err)
    	}
    	defer func() {
    		err = distFile.Close()
    		if err != nil {
    			log.Fatalf("目标文件关闭失败,原因是:%v
    ", err)
    		}
    	}()
    	//定义指定长度的字节切片,每次最多读取指定长度
    	var tmp = make([]byte, 1024*4)
    	//循环读取并写入
    	for {
    		n, err := srcFile.Read(tmp)
    		n, _ = distFile.Write(tmp[:n])
    		if err != nil {
    			if err == io.EOF {//读到了文件末尾,并且写入完毕,任务完成返回(关闭文件的操作由defer来完成)
    				return
    			} else {
    				log.Fatalf("拷贝过程中发生错误,错误原因为:%v
    ", err)
    			}
    		}
    	}
    }
    
    func main() {
    	CopyFile("./worm.mp4", "./dist.mp4")
    }
    

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

    package main
    
    import (
    	"fmt"
    	"io"
    	"os"
    )
    
    //自己编写一个函数,接收两个文件路径 srcFileName dstFileName
    func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
    
    	srcFile, err := os.Open(srcFileName)
    
    	if err != nil {
    		fmt.Printf("open file err = %v
    ", err)
    		return
    	}
    
    	defer srcFile.Close()
    
    	//打开dstFileName
    
    	dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0755)
    	if err != nil {
    		fmt.Printf("open file err = %v
    ", err)
    		return
    	}
    
    	defer dstFile.Close()
    
    	return io.Copy(dstFile, srcFile)
    
    }
    
    func main() {
    
    	result, err := CopyFile("./src/main/dst.png", "./src/main/file.png")
    
    	if err == nil {
    		fmt.Println("拷贝成功!,拷贝的字节数为: ", result)
    	}
    }
    

    还可以使用下面的方法

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"io"
    	"os"
    )
    
    //自己编写一个函数,接收两个文件路径 srcFileName dstFileName
    
    func CopyFile(dstFileName string, srcFileName string) (written int64, err error) {
    
    	srcFile, err := os.Open(srcFileName)
    
    	if err != nil {
    		fmt.Printf("open file err = %v
    ", err)
    		return
    	}
    
    	defer srcFile.Close()
    
    	//通过srcFile,获取到Reader
    	reader := bufio.NewReader(srcFile)
    
    	//打开dstFileName
    	dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY | os.O_CREATE, 0666)
    	if err != nil {
    		fmt.Printf("open file err = %v
    ", err)
    		return
    	}
    
    	writer := bufio.NewWriter(dstFile)
    	defer func() {
    		writer.Flush() //把缓冲区的内容写入到文件
    		dstFile.Close()
    
    	}()
    
    	return io.Copy(writer, reader)
    
    }
    
    func main() {
    
    	result, err := CopyFile("./src/main/dst.png", "./src/main/file.png")
    
    	if err == nil {
    		fmt.Println("拷贝成功!拷贝的字节大写为: ", result)
    	}
    }
    
    
  • 相关阅读:
    Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
    Atitit.rust语言特性 attilax 总结
    Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage  mvc mvp的 java c#.net php js
    Atitit.软件硕士  博士课程 一览表 attilax 总结
    Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
    Atitit.jdk java8的语法特性详解 attilax 总结
    Atitit.获取approot api 应用根路径 java c#.net php asp
    atitit.bsh BeanShell 的动态脚本使用java
    Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216  java c# php js.docx
    atitit.ntfs ext 文件系统新特性对比
  • 原文地址:https://www.cnblogs.com/itbsl/p/10138548.html
Copyright © 2011-2022 走看看