Help language development. Donate to The Perl Foundation

IO::Dir zef:raku-community-modules last updated on 2022-03-11
[![Build Status](](


IO::Dir - IO::Path.dir you can close


    # Won't always suit, since non-exhausted iterator holds on to an open
    # file descriptor until GC:

    # all good; we explicitly close the file descriptor when done
    .dir[^3].say and .close with 'foo';


[`IO::Path.dir`]( does the job well for
most cases, however, there's an edge case where it's no good:

- You don't exhaust or [eagerly](
    evaluate the `Seq` `dir` returns
- You do that enough times in some tight loop that
doesn't get a chance to clean up unreachable `dir` `Seq`s; or
- You run this on some system with tight open file limits

If you're in that category, then good news! `IO::Dir` gives you a `dir` whose
file descriptor you can close without relying on GC or having to [fully
the dir's `Seq`.


## `.new`

Creates a new `IO::Dir` object. Takes no args.

## `.open`

Opens for reading directory given as a positional argument, which can be
any object that can be coerced to `IO::Path` via `.IO` method. Defaults to
opening `'.'` directory.

Will first `.close` the invocant if it was previously opened.

    $ 'foo';

## `.dir`

Takes similar arguments as
[`IO::Path.dir`](, that have the same
meaning, returning the same type of `Seq`. Will `.close` the invocant when
the result is exhausted.

The additional arguments are boolean `:absolute` and `:Str` that control whether to return absolute paths when dir was opened via an absolute path and whether to
return paths as `IO::Path` or `Str` objects.

**Note:** you cannot call `.dir` more than once; re-open the
invocant or create a new `IO::Dir` if you need that. Will die if called on
an un-opened `IO::Dir`.

    # Explicit close:
    .dir[^3].say and .close with 'foo';

    # Implicit close (arrays are mostly-eager, so our Seq is exhausted here)
    my @files ='foo').dir;

## `.close`

Closes an open `IO::Dir`, freeing the file descriptor.

    .dir[^3].say and .close with 'foo';



Fork this module on GitHub:

#### BUGS

To report bugs or request features, please use


Zoffix Znet (


You can use and distribute this module under the terms of the
The Artistic License 2.0. See the `LICENSE` file included in this
distribution for complete details.

The `META6.json` file of this distribution may be distributed and modified
without restrictions or attribution.