Golang複製資料夾同時複製檔案
阿新 • • 發佈:2019-01-10
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
}