63 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			63 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | 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 | ||
|  | } |