• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go语言学习笔记----模拟实现文件拷贝函数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

实例1

//main
package main

import (
	"bufio"
	"flag"
	"fmt"
	"io"
	"os"
	"strings"
)

func fileExists(filename string) bool {
	_, err := os.Stat(filename)
	return err == nil || os.IsExist(err)
}

func copyFile(src, dst string) (w int64, err error) {
	srcFile, err := os.Open(src)
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	defer srcFile.Close()
	dstFile, err := os.Create(dst)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	defer dstFile.Close()

	return io.Copy(dstFile, srcFile)

}
func copyFileAction(src, dst string, showProgress, force bool) {
	if !force {
		if fileExists(dst) {
			fmt.Printf("%s exists override? y/n\n", dst)
			reader := bufio.NewReader(os.Stdin)
			data, _, _ := reader.ReadLine()

			if strings.TrimSpace(string(data)) != "y" {
				return
			}

		}

	}
	copyFile(src, dst)
	if showProgress {
		fmt.Printf("'%s'->'%s'\n", src, dst)
	}
}

func main() {
	var showProgress, force bool
    //定义命令行参数 flag.BoolVar(&force, "f", false, "force copy when existing") flag.BoolVar(&showProgress, "v", false, "explain what is being done") flag.Parse()     //非法命令行数量检测 if flag.NArg() < 2 { flag.Usage() return }
//取第0个参数与第一个参数作为源文件名跟目标文件名 copyFileAction(flag.Arg(0), flag.Arg(1), showProgress, force) }

 

 

示例2:Golang实现文件拷贝功能

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

// 编写一个函数,接收两个文件路径:
func copyFile(dstFileName string, srcFileName string) (written int64, err error) {
    srcFile, err := os.Open(srcFileName)
    if err != nil {
        fmt.Printf("open file error = %v\n", err)
    }
    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 error = %v\n", err)
        return
    }

    //通过dstFile,获取到WRITER
    writer := bufio.NewWriter(dstFile)
    //writer.Flush()

    defer dstFile.Close()

    return io.Copy(writer, reader)
}


func main() {
    //调用copyFile完成文件拷贝
    srcFile := "e:/copyFileTest02.pdf"
    dstFile := "e:/Go/tools/copyFileTest02.pdf"

    _, err := copyFile(dstFile, srcFile)
    if err == nil {
        fmt.Println("拷贝文件正常...")
    } else {
        fmt.Printf("拷贝文件出错了... err =%v\n", err)
    }
}

 说明:

1, 使用了带缓存的 bufio.NewReader(srcFile) 和 bufio.NewWriter(dstFile),一边读一边写,这样支持拷贝较大的文件;
2,defer dstFile.Close() 切记使用defer 来关闭打开的文件,避免内存泄漏;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go语言的unsafe包(转)发布时间:2022-07-10
下一篇:
go-micro client 客户端发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap