fs.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package helpers
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. )
  9. // ReadDir finds files according to extensions in the dir
  10. func ReadDir(dir string, extensions []string) ([]string, error) {
  11. confs, err := ioutil.ReadDir(dir)
  12. if err != nil {
  13. return nil, err
  14. }
  15. files := make([]string, 0)
  16. for _, f := range confs {
  17. ext := filepath.Ext(f.Name())
  18. for _, e := range extensions {
  19. if strings.EqualFold(ext, e) {
  20. files = append(files, filepath.Join(dir, f.Name()))
  21. break
  22. }
  23. }
  24. }
  25. return files, nil
  26. }
  27. // ReadDirRecursively finds files according to extensions in the dir recursively
  28. func ReadDirRecursively(dir string, extensions []string) ([]string, error) {
  29. files := make([]string, 0)
  30. err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  31. ext := filepath.Ext(path)
  32. for _, e := range extensions {
  33. if strings.EqualFold(ext, e) {
  34. files = append(files, path)
  35. break
  36. }
  37. }
  38. return nil
  39. })
  40. if err != nil {
  41. return nil, err
  42. }
  43. return files, nil
  44. }
  45. // ResolveFolderToFiles expands folder path (if any and it exists) to file paths.
  46. // Any other paths, like file, even URL, it returns them as is.
  47. func ResolveFolderToFiles(paths []string, extensions []string, recursively bool) ([]string, error) {
  48. dirReader := ReadDir
  49. if recursively {
  50. dirReader = ReadDirRecursively
  51. }
  52. files := make([]string, 0)
  53. for _, p := range paths {
  54. i, err := os.Stat(p)
  55. if err == nil && i.IsDir() {
  56. fs, err := dirReader(p, extensions)
  57. if err != nil {
  58. return nil, fmt.Errorf("failed to read dir %s: %s", p, err)
  59. }
  60. files = append(files, fs...)
  61. continue
  62. }
  63. files = append(files, p)
  64. }
  65. return files, nil
  66. }