删除文章

确定要删除这篇文章吗?

取消
确定

go模拟命令行文件拷贝命令

     阅读(69)  2020-02-23 09:42:51

通过这个小程序可以熟悉下面这些包和函数:

  1. 命令行参数解析(flag);
  2. 从命令行读取输入数据(bufio, reader);
  3. 文件操作,判断文件是否存在,创建拷贝文件(io, defer);
  4. 基本操作(fmt, string)

代码:

package main

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

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

func copyFile(src, dst string) error {
    srcFile, err := os.Open(src)
    if err != nil {
        return err
    }
    defer srcFile.Close()

    dstFile, err := os.Create(dst)
    if err != nil {
        return err
    }
    defer dstFile.Close()
    _, err = io.Copy(dstFile, srcFile)
    return err
}

func copyFileAction(src, dst string, force bool) error {
    if fileExit(dst) {
        if !force {
            return errors.New("dst file is exit")
        }

        fmt.Println("force copy, please input y?")
        reader := bufio.NewReader(os.Stdin)
        line, _, err := reader.ReadLine()
        if err != nil {
            return errors.New(fmt.Sprint("read line error:%v", err))
        }

        if strings.TrimSpace(string(line)) != "y" {
            return nil
        }
    }
    return copyFile(src, dst)
}

func main() {
    var force bool
    flag.BoolVar(&force, "f", false, "force copy when exiting")
    flag.Parse()

    if flag.NArg() < 2 {
        flag.Usage()
        return
    }

    err := copyFileAction(flag.Arg(0), flag.Arg(1), force)
    if err != nil {
        fmt.Println(err)
    }
}

测试:

普通拷贝,目标文件存在时不进行操作
project.exe test.txt test2.txt

强制拷贝,如果目标文件存在时会提示是否进行覆盖操作
project.exe -f test.txt test2.txt

文章评论

Keep it simple,stupid
文章数
309
总访问量
690888
今日访问
881
最近评论

liangzi : 不错 谢谢分享
tujiaw : registerThreadInactive:如果当前没有激活的线程,就去激活线程,让等待的线程去执行任务。
hgzzx : 佩服佩服。 请教:registerThreadInactive的作用是什么?
xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
回到顶部