Recursively traverses the directory tree rooted at this and yields WalkEntry values describing each directory and its immediate children.
Semantics are inspired by Python's os.walk and pathlib.Path.walk:
- Traversal order can be top-down (pre-order, default) or bottom-up
(post-order) controlled by topDown.
- Symlink traversal is disabled by default; when
followSymlinks is
true, symlinked directories may be traversed, with loop protection to avoid cycles. To keep results predictable, traversal suppresses revisiting the same physical directory (device+inode on POSIX; absolute resolved path on Windows), which prevents duplicates when the same directory is reachable via multiple paths.
- Pruning: if
dirFilter is provided, any subdirectory for which
dirFilter(childDirPath) returns false is excluded from the yielded dirs list and is not traversed.
- Error handling: errors while listing a directory are ignored for that
subtree (it is skipped), and iteration continues. This provides robust behavior similar to typical walkers.
- Non-directory roots: If
this is not a directory, the returned range
is empty.
Parameters
topDown | If true, yield parent directories before their children; if false, yield after traversing children. |
followSymlinks | Whether to traverse into symlinked directories. |
dirFilter | Optional pruning predicate. When provided and it returns false for a child directory, that child is omitted and not descended into. |
Examples
// Pre-order walk (top-down) with simple pruning
bool delegate(const Path) prune = (const Path p) => p.name() != ".git";
foreach (step; Path("/project").walk(true, false, prune)) {
// step.root, step.dirs, step.files
}
Returns
A lazy input range of WalkEntry values.