71 lines
1.1 KiB
Go
71 lines
1.1 KiB
Go
package internal
|
|
|
|
import (
|
|
"errors"
|
|
"maps"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
func MultiScan(rootDirs ...string) (Files, error) {
|
|
files := Files{}
|
|
|
|
for _, rootDir := range rootDirs {
|
|
moreFiles, err := Scan(rootDir)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
maps.Copy(files, moreFiles)
|
|
}
|
|
|
|
return files, nil
|
|
}
|
|
|
|
func Scan(rootDir string) (Files, error) {
|
|
if !path.IsAbs(rootDir) {
|
|
return nil, errors.New("rootDir must be absolute path")
|
|
}
|
|
|
|
paths, err := scanRecursive(rootDir)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
l := len(rootDir)
|
|
files := Files{}
|
|
for _, path := range paths {
|
|
files[path] = &File{
|
|
RootDir: rootDir,
|
|
Path: path[l:],
|
|
}
|
|
}
|
|
|
|
return files, nil
|
|
}
|
|
|
|
func scanRecursive(dir string) ([]string, error) {
|
|
paths := []string{}
|
|
|
|
entries, err := os.ReadDir(dir)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, entry := range entries {
|
|
path := path.Join(dir, entry.Name())
|
|
|
|
if entry.IsDir() {
|
|
subPaths, err := scanRecursive(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
paths = append(paths, subPaths...)
|
|
} else {
|
|
paths = append(paths, path)
|
|
}
|
|
}
|
|
|
|
return paths, nil
|
|
}
|