diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp index 80d0958a759..8d89b1c1e5e 100644 --- a/libraries/FS/src/FS.cpp +++ b/libraries/FS/src/FS.cpp @@ -187,6 +187,22 @@ File File::openNextFile(const char* mode) return _p->openNextFile(mode); } +boolean File::seekDir(long position){ + if(!_p){ + return false; + } + return _p->seekDir(position); +} + +String File::getNextFileName(void) +{ + if (!_p) { + return ""; + } + return _p->getNextFileName(); + +} + void File::rewindDirectory(void) { if (!*this) { diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h index 64e630c4577..95e6f265deb 100644 --- a/libraries/FS/src/FS.h +++ b/libraries/FS/src/FS.h @@ -78,7 +78,9 @@ class File : public Stream const char* name() const; boolean isDirectory(void); + boolean seekDir(long position); File openNextFile(const char* mode = FILE_READ); + String getNextFileName(void); void rewindDirectory(void); protected: diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h index bb20cd499ae..263ab191d8a 100644 --- a/libraries/FS/src/FSImpl.h +++ b/libraries/FS/src/FSImpl.h @@ -43,6 +43,8 @@ class FileImpl virtual const char* name() const = 0; virtual boolean isDirectory(void) = 0; virtual FileImplPtr openNextFile(const char* mode) = 0; + virtual boolean seekDir(long position); + virtual String getNextFileName(void); virtual void rewindDirectory(void) = 0; virtual operator bool() = 0; }; diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index 25a27c70bcf..ab7dccb7599 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -476,6 +476,36 @@ FileImplPtr VFSFileImpl::openNextFile(const char* mode) return std::make_shared(_fs, name.c_str(), mode); } +boolean VFSFileImpl::seekDir(long position){ + if(!_d){ + return false; + } + seekdir(_d, position); + return true; +} + + +String VFSFileImpl::getNextFileName() +{ + if (!_isDirectory || !_d) { + return ""; + } + struct dirent *file = readdir(_d); + if (file == NULL) { + return ""; + } + if (file->d_type != DT_REG && file->d_type != DT_DIR) { + return ""; + } + String fname = String(file->d_name); + String name = String(_path); + if (!fname.startsWith("/") && !name.endsWith("/")) { + name += "/"; + } + name += fname; + return name; +} + void VFSFileImpl::rewindDirectory(void) { if(!_isDirectory || !_d) { diff --git a/libraries/FS/src/vfs_api.h b/libraries/FS/src/vfs_api.h index 780c334aa5c..fe475bd35cb 100644 --- a/libraries/FS/src/vfs_api.h +++ b/libraries/FS/src/vfs_api.h @@ -71,6 +71,8 @@ class VFSFileImpl : public FileImpl const char* name() const override; time_t getLastWrite() override; boolean isDirectory(void) override; + boolean seekDir(long position) override; + String getNextFileName(void) override; FileImplPtr openNextFile(const char* mode) override; void rewindDirectory(void) override; operator bool();