GOLANG实现的一个cp dst src 函数,可带-f -v参数。如果不带-f参数,而且dst file 存在,则提示是否overwrite dst file,根据输入作相应动作;带-f,则不询问,直接overwrite已经存在的dst file. -v参数打印出一些提示。
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
"strings"
)
var (
showProcess bool
forceCp bool
)
func init() {
flag.BoolVar(&showProcess, "v", false, "show copy msg")
flag.BoolVar(&forceCp, "f", false, "false to cp")
flag.Parse()
}
func main() {
if flag.NArg() < 2 {
flag.Usage()
fmt.Println("error: Need dst and src file!!")
return
}
CopyFile(flag.Arg(0), flag.Arg(1))
}
func fileExist(filename string) bool {
_, err := os.Stat(filename)
return err == nil || os.IsExist(err)
}
func copyActioin(dst, src string) (w int64, err error) {
var (
srcFile *os.File
dstFile *os.File
)
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 CopyFile(dst, src string) {
if !forceCp {
if fileExist(dst) {
fmt.Printf("%s existed overwrite?[y/n]", dst)
reader := bufio.NewReader(os.Stdin)
data, _, _ := reader.ReadLine()
if strings.ToLower(strings.TrimSpace(string(data)))[0] != 'y' {
return
}
}
}
copyActioin(dst, src)
if showProcess {
fmt.Printf("%s =====>> %s", src, dst)
}
}
测试:
F:\godownload\src\awesomeProject>example_io.exe backup.go example_io.og
open example_io.og: The system cannot find the file specified.
F:\godownload\src\awesomeProject>example_io.exe backup.go example_io.go
F:\godownload\src\awesomeProject>example_io.exe backup.go example_io.go
backup.go existed overwrite?[y/n]y
F:\godownload\src\awesomeProject>example_io.exe backup.go example_io.go
backup.go existed overwrite?[y/n]n
F:\godownload\src\awesomeProject>example_io.exe -v backup.go example_io.go
backup.go existed overwrite?[y/n]y
example_io.go =====>> backup.go
F:\godownload\src\awesomeProject>example_io.exe -v -f backup.go example_io.go
example_io.go =====>> backup.go
F:\godownload\src\awesomeProject>