fs.go 1.6 KB

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