// RemoveAll removes a tree recursively. func RemoveAll(path string, vfs rwvfs.WalkableFileSystem) error { w := fs.WalkFS(path, vfs) remove := func(par *parallel.Run, path string) { par.Do(func() error { return vfs.Remove(path) }) } var dirs []string // remove dirs after removing all files filesPar := parallel.NewRun(20) for w.Step() { if err := w.Err(); err != nil { return err } if w.Stat().IsDir() { dirs = append(dirs, w.Path()) } else { remove(filesPar, w.Path()) } } if err := filesPar.Wait(); err != nil { return err } dirsPar := parallel.NewRun(20) sort.Sort(sort.Reverse(sort.StringSlice(dirs))) // reverse so we delete leaf dirs first for _, dir := range dirs { remove(dirsPar, dir) } return dirsPar.Wait() }