在 IO::Path 中§

有关例程 dir,请参阅上下文中的主要文档

multi  dir(*%_)
multi  dir(IO::Path:D $path|c)
multi  dir(IO()       $path|c)
method dir(IO::Path:D: Mu :$test = $*SPEC.curupdir)

返回一个惰性列表,其中包含与目录中的条目对应的 IO::Path 对象,这些条目可以选择通过按其名称(作为字符串)进行智能匹配来过滤,具体取决于 :test 参数。文件系统返回条目的顺序决定了列表中条目/对象顺序。不包括对应于特殊目录条目 ... 的对象。$path 决定了对象的路径是绝对路径还是相对路径。

由于测试是针对Str参数执行的,而不是IO,因此测试是在 $*CWD 中执行的,而不是在目标目录中执行的。在针对文件测试运算符进行测试时,这将不起作用

dir('mydir'test => { .IO.d })

而这将起作用

dir('mydir'test => { "mydir/$_".IO.d })

注意:dir 调用会打开一个目录以供读取,这会算入程序的最大每个进程打开文件数。在执行诸如递归执行更多 dir 调用之类的操作之前,请务必用尽返回的Seq。你可以通过赋值给一个 @- 符号变量或简单地对其进行循环来用尽它。请注意,下面的示例是如何将要查看的进一步目录推送到Array中,而不是立即对它们调用 dir。另请参阅IO::Dir 模块,它可以让你更精细地控制关闭目录句柄。

示例

# To iterate over the contents of the current directory: 
for dir() -> $file {
    say $file;
}
 
# As before, but include even '.' and '..' which are filtered out by 
# the default :test matcher: 
for dir(test => *-> $file {
    say $file;
}
 
# To get the names of all .jpg and .jpeg files in the home directory of the current user: 
my @jpegs = $*HOME.dir: test => /:i '.' jpe?$/;

列出所有文件和目录(递归)的示例程序

sub MAIN($dir = '.'{
    my @todo = $dir.IO;
    while @todo {
        for @todo.pop.dir -> $path {
            say $path.Str;
            @todo.push: $path if $path.d;
        }
    }
}

一种惰性方式,从当前目录开始递归查找以 “.raku” 结尾的前三个文件

my @stack = '.'.IO;
my $raku-files = gather while @stack {
    with @stack.pop {
        when :d { @stack.append: .dir }
        .take when .extension.lc eq 'raku'
    }
}
.put for $raku-files[^3];