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

Table of Contents

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

    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
    

    上一篇文章

    下一篇文章