代码
go
复制代码
package zdpgo_file
import (
"errors"
"os"
"path/filepath"
"strings"
)
// CopyDir 复制文件夹
// @param srcPath 源文件夹
// @param desPath 目标文件夹
// @return error 错误信息
func CopyDir(srcPath, desPath string) error {
// 检查目录是否正确
if !IsDir(srcPath) {
return errors.New("要复制的文件夹不存在")
}
// 源文件夹和目标文件夹不能相同
if strings.TrimSpace(srcPath) == strings.TrimSpace(desPath) {
return errors.New("源文件夹和目标文件夹不能相同")
}
// 创建目标文件夹
if !IsDir(desPath) {
err := AddDir(desPath)
if err != nil {
return err
}
}
// 路径规范
srcPath = strings.Replace(srcPath, "\\", "/", -1)
desPath = strings.Replace(desPath, "\\", "/", -1)
// 遍历源文件夹
err := filepath.Walk(srcPath, func(path string, f os.FileInfo, err error) error {
if f == nil {
return err
}
// 复制目录是将源目录中的子目录复制到目标路径中,不包含源目录本身
if path == srcPath {
return nil
}
// 生成新路径
destNewPath := desPath + "/" + path
destNewPath = strings.Replace(destNewPath, "\\", "/", -1)
// 如果发生了递归,则退出
if strings.Count(destNewPath, desPath) > 1 {
return nil
}
// 如果是文件:复制文件
// 如果是文件夹:不存在就创建新文件夹
if !f.IsDir() {
err = CopyFile(path, destNewPath)
if err != nil {
return err
}
} else {
if !IsExist(destNewPath) {
return AddDir(destNewPath)
}
}
return nil
})
// 返回
return err
}
测试
go
复制代码
package zdpgo_file
import "testing"
func TestCopyDir(t *testing.T) {
if err := AddDir("test"); err != nil {
t.Fatal(err)
}
data := []struct {
Src string
Dst string
}{
{".", "test/test2"},
{"test/test2", "test/test1"},
}
for _, tt := range data {
v := CopyDir(tt.Src, tt.Dst)
if v != nil {
t.Error(v)
}
}
}
测试结果