Golang 实现复制文件夹同时复制文件

浏览:67日期:2022-08-25

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}

补充:golang把文件复制到另一个目录

本程序 主要功能是把A文件夹下的文件与B目录下文件对比,如果找到就覆盖到B相应的目录下。

用法: merge A目录 B目录

merge.go

package mainimport ( 'flag' 'fmt' 'os' 'path/filepath' 'strings' 'time' 'github.com/Unknwon/com')const ( IsDirectory = iota IsRegular IsSymlink)type sysFile struct { fType int fName string fLink string fSize int64 fMtime time.Time fPerm os.FileMode}type F struct { files []*sysFile}func (self *F) visit(path string, f os.FileInfo, err error) error { if f == nil { return err } var tp int if f.IsDir() { tp = IsDirectory } else if (f.Mode() & os.ModeSymlink) > 0 { tp = IsSymlink } else { tp = IsRegular } inoFile := &sysFile{ fName: path, fType: tp, fPerm: f.Mode(), fMtime: f.ModTime(), fSize: f.Size(), } self.files = append(self.files, inoFile) return nil}func main() { flag.Parse() sourcedir := flag.Arg(0) decdir := flag.Arg(1) source := F{ files: make([]*sysFile, 0), } err := filepath.Walk(sourcedir, func(path string, f os.FileInfo, err error) error { return source.visit(path, f, err) }) if err != nil { fmt.Printf('filepath.Walk() returned %vn', err) } dec := F{ files: make([]*sysFile, 0), } err = filepath.Walk(decdir, func(path string, f os.FileInfo, err error) error { return dec.visit(path, f, err) }) if err != nil { fmt.Printf('filepath.Walk() returned %vn', err) } for _, v := range source.files { if com.IsFile(v.fName) == true { tmp1 := strings.Split(v.fName, '') sourcename := tmp1[len(tmp1)-1] for _, r := range dec.files { if com.IsFile(r.fName) == true { tmp2 := strings.Split(r.fName, '') decname := tmp2[len(tmp2)-1] if sourcename == decname { fmt.Printf('the same file: %sn', sourcename) com.Copy(v.fName, r.fName) } } } } }}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持乐呵呵网。如有错误或未考虑完全的地方,望不吝赐教。

标签: Golang
相关文章: