uvco 0.1
Loading...
Searching...
No Matches
uvco::Directory Class Reference

#include <fs.h>

Classes

struct  DirEnt

Public Member Functions

 Directory (const Directory &)=default
 Directory (Directory &&other) noexcept
Directoryoperator= (const Directory &)=delete
Directoryoperator= (Directory &&other) noexcept
 ~Directory ()
Promise< std::vector< DirEnt > > read (unsigned count=64)
 Read up to count directory entries.
Promise< unsigned int > read (std::span< DirEnt > buffer)
 Read up to buffer.size() directory entries into that buffer.
void close ()
 Close the directory.

Static Public Member Functions

static Promise< void > mkdir (const Loop &loop, std::string_view path, int mode=0755)
 Create a directory.
static Promise< void > rmdir (const Loop &loop, std::string_view path)
 Remove a directory. It must be empty.
static Promise< Directoryopen (const Loop &loop, std::string_view path)
 Open a directory for reading.
static MultiPromise< DirEntreadAll (const Loop &loop, std::string_view path)
 Read all directory entries of the given directory.

Private Member Functions

 Directory (uv_loop_t *loop, uv_dir_t *dir)

Private Attributes

uv_loop_t * loop_
uv_dir_t * dir_

Constructor & Destructor Documentation

◆ Directory() [1/3]

uvco::Directory::Directory ( const Directory & )
default

◆ Directory() [2/3]

uvco::Directory::Directory ( Directory && other)
noexcept
119 : loop_{other.loop_}, dir_{other.dir_} {
120 other.loop_ = nullptr;
121 other.dir_ = nullptr;
122}
uv_dir_t * dir_
Definition fs.h:66
uv_loop_t * loop_
Definition fs.h:65

◆ ~Directory()

uvco::Directory::~Directory ( )
141{ close(); }
void close()
Close the directory.
Definition fs.cc:223

◆ Directory() [3/3]

uvco::Directory::Directory ( uv_loop_t * loop,
uv_dir_t * dir )
inlineexplicitprivate
63: loop_{loop}, dir_{dir} {}

Member Function Documentation

◆ close()

void uvco::Directory::close ( )

Close the directory.

223 {
224 if (dir_ != nullptr) {
225 uv_fs_closedir(loop_, new uv_fs_t{}, dir_, onDirectoryDtorDone);
226 }
227 dir_ = nullptr;
228}
void onDirectoryDtorDone(uv_fs_t *req)
Definition fs.cc:137

◆ mkdir()

Promise< void > uvco::Directory::mkdir ( const Loop & loop,
std::string_view path,
int mode = 0755 )
static

Create a directory.

144 {
145 FileOpAwaiter_ awaiter;
146
147 const std::string path_str(path);
148 uv_fs_mkdir(loop.uvloop(), &awaiter.req(), path_str.c_str(), mode,
149 FileOpAwaiter_::uvCallback());
150
151 co_await awaiter;
152
153 co_return;
154}

◆ open()

Promise< Directory > uvco::Directory::open ( const Loop & loop,
std::string_view path )
static

Open a directory for reading.

168 {
169 FileOpAwaiter_ awaiter;
170
171 const std::string path_str(path);
172 uv_fs_opendir(loop.uvloop(), &awaiter.req(), path_str.c_str(),
173 FileOpAwaiter_::uvCallback());
174
175 co_await awaiter;
176
177 co_return Directory{loop.uvloop(), (uv_dir_t *)awaiter.req().ptr};
178}
Directory(const Directory &)=default

◆ operator=() [1/2]

Directory & uvco::Directory::operator= ( const Directory & )
delete

◆ operator=() [2/2]

Directory & uvco::Directory::operator= ( Directory && other)
noexcept
124 {
125 if (this == &other) {
126 return *this;
127 }
128 loop_ = other.loop_;
129 dir_ = other.dir_;
130 other.loop_ = nullptr;
131 other.dir_ = nullptr;
132 return *this;
133}

◆ read() [1/2]

Promise< unsigned int > uvco::Directory::read ( std::span< DirEnt > buffer)

Read up to buffer.size() directory entries into that buffer.

187 {
188 // dirents vector must be declared before awaiter, because awaiter will free
189 // contents of dirents.
190 std::vector<uv_dirent_t> dirents(buffer.size());
191 dir_->dirents = dirents.data();
192 dir_->nentries = dirents.size();
193
194 FileOpAwaiter_ awaiter;
195
196 uv_fs_readdir(loop_, &awaiter.req(), dir_, FileOpAwaiter_::uvCallback());
197
198 co_await awaiter;
199
200 unsigned int nentries = awaiter.req().result;
201 for (unsigned i = 0; i < nentries; ++i) {
202 buffer[i].name = dirents[i].name;
203 buffer[i].type = dirents[i].type;
204 }
205 co_return nentries;
206}

◆ read() [2/2]

Promise< std::vector< Directory::DirEnt > > uvco::Directory::read ( unsigned count = 64)

Read up to count directory entries.

180 {
181 std::vector<DirEnt> result{count};
182 const unsigned int size = co_await read(result);
183 result.resize(size);
184 co_return result;
185}
Promise< std::vector< DirEnt > > read(unsigned count=64)
Read up to count directory entries.
Definition fs.cc:180

◆ readAll()

MultiPromise< Directory::DirEnt > uvco::Directory::readAll ( const Loop & loop,
std::string_view path )
static

Read all directory entries of the given directory.

209 {
210 FileOpAwaiter_ awaiter;
211 uv_dirent_t dirent;
212 const std::string pathCopy{path};
213
214 uv_fs_scandir(loop.uvloop(), &awaiter.req(), pathCopy.c_str(), 0,
215 FileOpAwaiter_::uvCallback());
216
217 co_await awaiter;
218 while (UV_EOF != uv_fs_scandir_next(&awaiter.req(), &dirent)) {
219 co_yield DirEnt{.name = dirent.name, .type = dirent.type};
220 }
221}
Definition fs.h:38

◆ rmdir()

Promise< void > uvco::Directory::rmdir ( const Loop & loop,
std::string_view path )
static

Remove a directory. It must be empty.

156 {
157 FileOpAwaiter_ awaiter;
158
159 const std::string path_str(path);
160 uv_fs_rmdir(loop.uvloop(), &awaiter.req(), path_str.c_str(),
161 FileOpAwaiter_::uvCallback());
162
163 co_await awaiter;
164
165 co_return;
166}

Member Data Documentation

◆ dir_

uv_dir_t* uvco::Directory::dir_
private

◆ loop_

uv_loop_t* uvco::Directory::loop_
private

The documentation for this class was generated from the following files: