diff options
author | Sam Atkins <atkinssj@serenityos.org> | 2023-03-02 17:01:08 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-03-05 20:23:42 +0100 |
commit | 23aec16e8b0186171b471b375d6fa172efd2ed1d (patch) | |
tree | 0dd214e446d4c3104a24784a59d2863dd2c147e7 /Userland/Libraries/LibCore/Directory.h | |
parent | ceaed7440e323d5a82ee9d3988e6cf4afd957834 (diff) | |
download | serenity-23aec16e8b0186171b471b375d6fa172efd2ed1d.zip |
LibCore: Introduce a new directory iteration API
`Core::Directory::for_each_entry()` takes a callback which is passed the
DirectoryEntry and the parent Directory. It returns any error from
creating the iterator, iterating the entries, or returned from the
callback.
As a simple example, this:
```c++
Core::DirIterator piece_set_iterator { "/res/icons/chess/sets/",
Core::DirIterator::SkipParentAndBaseDir };
while (piece_set_iterator.has_next())
m_piece_sets.append(piece_set_iterator.next_path());
```
becomes this:
```c++
TRY(Core::Directory::for_each_entry("/res/icons/chess/sets/"sv,
Core::DirIterator::SkipParentAndBaseDir,
[&](auto const& entry, auto&) -> ErrorOr<IterationDecision> {
TRY(m_piece_sets.try_append(entry.name));
return IterationDecision::Continue;
}));
```
Diffstat (limited to 'Userland/Libraries/LibCore/Directory.h')
-rw-r--r-- | Userland/Libraries/LibCore/Directory.h | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/Userland/Libraries/LibCore/Directory.h b/Userland/Libraries/LibCore/Directory.h index ccc97e0714..ec04cc714a 100644 --- a/Userland/Libraries/LibCore/Directory.h +++ b/Userland/Libraries/LibCore/Directory.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org> + * Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -8,17 +9,19 @@ #include <AK/Error.h> #include <AK/Format.h> +#include <AK/Function.h> +#include <AK/IterationDecision.h> #include <AK/LexicalPath.h> #include <AK/Noncopyable.h> #include <AK/Optional.h> +#include <LibCore/DirIterator.h> +#include <LibCore/DirectoryEntry.h> #include <LibCore/File.h> #include <dirent.h> #include <sys/stat.h> namespace Core { -class DirIterator; - // Deal with real system directories. Any Directory instance always refers to a valid existing directory. class Directory { AK_MAKE_NONCOPYABLE(Directory); @@ -43,6 +46,10 @@ public: LexicalPath const& path() const { return m_path; } + using ForEachEntryCallback = Function<ErrorOr<IterationDecision>(DirectoryEntry const&, Directory const& parent)>; + static ErrorOr<void> for_each_entry(StringView path, DirIterator::Flags, ForEachEntryCallback); + ErrorOr<void> for_each_entry(DirIterator::Flags, ForEachEntryCallback); + ErrorOr<void> chown(uid_t, gid_t); static ErrorOr<bool> is_valid_directory(int fd); |