1. 程式人生 > >Golang複製資料夾同時複製檔案

Golang複製資料夾同時複製檔案

Golang 複製資料夾,包括資料夾中的檔案

/**
 * 拷貝資料夾,同時拷貝資料夾中的檔案
 * @param srcPath  		需要拷貝的資料夾路徑: D:/test
 * @param destPath		拷貝到的位置: D/backup/
 */
func CopyDir(srcPath string, destPath string) error {
	//檢測目錄正確性
	if srcInfo, err := os.Stat(srcPath); err != nil {
		fmt.Println(err.Error())
		return err
	} else {
		if !srcInfo.
IsDir() { e := errors.New("srcPath不是一個正確的目錄!") fmt.Println(e.Error()) return e } } if destInfo, err := os.Stat(destPath); err != nil { fmt.Println(err.Error()) return err } else { if !destInfo.IsDir() { e := errors.New("destInfo不是一個正確的目錄!") fmt.Println(e.Error()) return e }
} //加上拷貝時間:不用可以去掉 destPath = destPath + "_" + time.Now().Format("20060102150405") err := filepath.Walk(srcPath, func(path string, f os.FileInfo, err error) error { if f == nil { return err } if !f.IsDir() { path := strings.Replace(path, "\\", "/", -1) destNewPath := strings.Replace(path,
srcPath, destPath, -1) fmt.Println("複製檔案:" + path + " 到 " + destNewPath) copyFile(path, destNewPath) } return nil }) if err != nil { fmt.Printf(err.Error()) } return err } //生成目錄並拷貝檔案 func copyFile(src, dest string) (w int64, err error) { srcFile, err := os.Open(src) if err != nil { fmt.Println(err.Error()) return } defer srcFile.Close() //分割path目錄 destSplitPathDirs := strings.Split(dest, "/") //檢測時候存在目錄 destSplitPath := "" for index, dir := range destSplitPathDirs { if index < len(destSplitPathDirs)-1 { destSplitPath = destSplitPath + dir + "/" b, _ := pathExists(destSplitPath) if b == false { fmt.Println("建立目錄:" + destSplitPath) //建立目錄 err := os.Mkdir(destSplitPath, os.ModePerm) if err != nil { fmt.Println(err) } } } } dstFile, err := os.Create(dest) if err != nil { fmt.Println(err.Error()) return } defer dstFile.Close() return io.Copy(dstFile, srcFile) } //檢測資料夾路徑時候存在 func pathExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err }