G練習題(7)

實現目錄的複製(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)
			}
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章