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)
    	}
    }
    
    
  • 相关阅读:
    一个JS的问题,请帮下忙!
    开始练习VS2003了
    SQL查询结果的合并问题
    几个微软的好东西!
    对谷歌输入发的一点疑虑
    Visual studio 2005 sdk 安装引起的后果
    Socket协议测试:TPS偏低,和响应时间计算出来的TPS不相符的问题
    数据库索引失效
    挡板模拟器桩模块驱动模块
    nmon 监控结果
  • 原文地址:https://www.cnblogs.com/itbsl/p/10138548.html
Copyright © 2011-2022 走看看