實現目錄的複製(copy)
package main
import (
"bufio"
"flag"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
)
func copyfile(src,desc string) {
srcfile,err := os.Open(src)
if err != nil {
fmt.Println(err)
} else {
defer srcfile.Close()
descfile,err := os.Create(desc)
if err != nil {
fmt.Println(err)
}else {
defer descfile.Close()
if err != nil {
fmt.Println(err)
}else {
bytes := make([]byte,1024*1024)
reader := bufio.NewReader(srcfile)
writer := bufio.NewWriter(descfile)
for {
n, err := reader.Read(bytes)
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
}
writer.Write(bytes[:n])
writer.Flush()
}
}
}
}
}
//copy目錄
func copyDir(src ,dest string) {
fileinfo,err := ioutil.ReadDir(src)
//dest不存在,創建dest,存在忽略 不打印報錯
os.Mkdir(dest,0644)
//首先判斷是否有報錯
if err != nil {
//判斷報錯是否是因爲src目錄或者文件不存在引起的
if os.IsNotExist(err){
fmt.Printf("%v不存在",src)
}else {
//如果不是因爲不存在引起的那麼打印報錯
fmt.Println(err)
}
//如果沒有報錯的話執行
}else {
//遍歷目錄信息
for _,files := range fileinfo{
//如果src/xxx xxx是目錄 是目錄就遞歸調用
if files.IsDir(){
copyDir(filepath.Join(src,files.Name()),filepath.Join(dest,files.Name()))
}else {
//如果xxx不是目錄 就複製文件
copyfile(filepath.Join(src,files.Name()),filepath.Join(dest,files.Name()))
}
}
}
}
func main() {
src := flag.String("s","","src file")
desc := flag.String("d","","desc file")
help := flag.Bool("h",false,"help")
flag.Usage = func() {
fmt.Println("Usage: copyfile -s xxx -d xxx")
flag.PrintDefaults()
}
//解析參數
flag.Parse()
if *src == "" || *desc == "" || *help {
flag.Usage()
} else {
file,err := os.Stat(*src)
//判斷src是否有報錯
if err != nil {
//判斷是否因爲src不存在報錯
if os.IsNotExist(err){
fmt.Printf("%v 不存在\n",*src)
}else {
//如果不是不存在打印報錯信息
fmt.Println(err)
}
}else {
//src是目錄
if file.IsDir() {
copyDir(*src,*desc)
}else {
//src是文件
copyfile(*src,*desc)
}
}
}
}