package fileutils import ( "errors" "github.com/spf13/afero" ) // CopyDir copies a directory from source to dest and all // of its sub-directories. It doesn't stop if it finds an error // during the copy. Returns an error if any. func CopyDir(fs afero.Fs, source string, dest string) error { // Get properties of source. srcinfo, err := fs.Stat(source) if err != nil { return err } // Create the destination directory. err = fs.MkdirAll(dest, srcinfo.Mode()) if err != nil { return err } dir, _ := fs.Open(source) obs, err := dir.Readdir(-1) if err != nil { return err } var errs []error for _, obj := range obs { fsource := source + "/" + obj.Name() fdest := dest + "/" + obj.Name() if obj.IsDir() { // Create sub-directories, recursively. err = CopyDir(fs, fsource, fdest) if err != nil { errs = append(errs, err) } } else { // Perform the file copy. err = CopyFile(fs, fsource, fdest) if err != nil { errs = append(errs, err) } } } var errString string for _, err := range errs { errString += err.Error() + "\n" } if errString != "" { return errors.New(errString) } return nil }