Closed
Description
There are a few annoyances with filepath.Walk, but the biggest problem is that it is needlessly inefficient. The new ReadDir API (#41467) provides a way to avoid the inefficiency in the implementation, but that must be paired with a new API that does not offer a FileInfo to the callback, since obtaining the FileInfo is the expensive part.
#41974 proposes a new API with an iterator object. That may or may not be a good idea.
If that one doesn't work out, here's a smaller change: add WalkDir that replaces FileInfo with DirEntry but otherwise behaves exactly the same as Walk:
type WalkDirFunc func(path string, entry fs.DirEntry, err error) error
WalkDirFunc is the type of the function called for each file or directory
visited by WalkDir. The path argument contains the argument to WalkDir as a
prefix; that is, if WalkDir is called with "dir", which is a directory
containing the file "a", the walk function will be called with argument
"dir/a". The info argument is the fs.DirEntry for the named path.
If there was a problem walking to the file or directory named by path, the
incoming error will describe the problem and the function can decide how to
handle that error (and WalkDir will not descend into that directory). In the
case of an error, the info argument will be nil. If an error is returned,
processing stops. The sole exception is when the function returns the
special value SkipDir. If the function returns SkipDir when invoked on a
directory, WalkDir skips the directory's contents entirely. If the function
returns SkipDir when invoked on a non-directory file, WalkDir skips the
remaining files in the containing directory.
func WalkDir(root string, fn WalkDirFunc) error
WalkDir walks the file tree rooted at root, calling fn for each file or
directory in the tree, including root. All errors that arise visiting files
and directories are filtered by fn. The files are walked in lexical
order, which makes the output deterministic but means that for very large
directories WalkDir can be inefficient. WalkDir does not follow symbolic links.
The only changes here are s/Walk/WalkDir/g and s/FileInfo/DirEntry/g.