package fileop import ( "crypto/sha256" "fmt" "io" "os" "path/filepath" ) type WalkMode int const ( Folder WalkMode = iota File FileFolder ) func WalkFolder(folder string, walkMode WalkMode) <-chan string { c := make(chan string) go func(folder string, c chan string) { filepath.Walk(folder, func(path string, info os.FileInfo, err error) error { file, _ := os.Open(path) defer file.Close() fileInfo, _ := file.Stat() switch walkMode { case Folder: if fileInfo.IsDir() { c <- path } case File: if !fileInfo.IsDir() { c <- path } case FileFolder: c <- path } return nil }) close(c) }(folder, c) return c } func CalculateSHA256(r io.Reader) (string, error) { h := sha256.New() if _, err := io.Copy(h, r); err != nil { return "", err } shaString := fmt.Sprintf("%x", h.Sum(nil)) return shaString, nil } type MoveCommand struct { Source string Destination string } func Move() chan<- *MoveCommand { c := make(chan *MoveCommand) go func(chan *MoveCommand) { for cmd := range c { // TODO: add error handling err := os.Rename(cmd.Source, cmd.Destination) if err != nil { fmt.Println(err.Error()) } } }(c) return c } func IsEmpty(name string) (bool, error) { f, err := os.Open(name) if err != nil { return false, err } defer f.Close() _, err = f.Readdirnames(1) if err == io.EOF { return true, nil } return false, err }