58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package fswatch
|
|
|
|
import (
|
|
"errors"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
)
|
|
|
|
// walkDirGeneric is the portable walkDir implementation. It is used as the
|
|
// primary implementation on platforms without a native version, and is
|
|
// tested on all platforms.
|
|
func walkDirGeneric(dir string, recursive bool, fn func(path string, isDir bool) error) error {
|
|
info, err := os.Lstat(dir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !info.IsDir() {
|
|
return syscall.ENOTDIR
|
|
}
|
|
return walkDirGenericVisit(dir, recursive, fn)
|
|
}
|
|
|
|
func walkDirGenericVisit(dir string, recursive bool, fn func(path string, isDir bool) error) error {
|
|
entries, err := os.ReadDir(dir)
|
|
if err != nil {
|
|
if errors.Is(err, fs.ErrPermission) || errors.Is(err, fs.ErrNotExist) {
|
|
return nil
|
|
}
|
|
return err
|
|
}
|
|
if fn != nil {
|
|
if err := fn(dir, true); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
for _, e := range entries {
|
|
path := dir + string(filepath.Separator) + e.Name()
|
|
if e.IsDir() {
|
|
if recursive {
|
|
if err := walkDirGenericVisit(path, recursive, fn); err != nil {
|
|
return err
|
|
}
|
|
} else if fn != nil {
|
|
if err := fn(path, true); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
} else if fn != nil {
|
|
if err := fn(path, false); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|