diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp index 8d89b1c1e5e..75821bd4ac0 100644 --- a/libraries/FS/src/FS.cpp +++ b/libraries/FS/src/FS.cpp @@ -203,6 +203,15 @@ String File::getNextFileName(void) } +String File::getNextFileName(bool *isDir) +{ + if (!_p) { + return ""; + } + return _p->getNextFileName(isDir); + +} + void File::rewindDirectory(void) { if (!*this) { diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h index 95e6f265deb..ef1a26915bb 100644 --- a/libraries/FS/src/FS.h +++ b/libraries/FS/src/FS.h @@ -81,6 +81,7 @@ class File : public Stream boolean seekDir(long position); File openNextFile(const char* mode = FILE_READ); String getNextFileName(void); + String getNextFileName(boolean *isDir); void rewindDirectory(void); protected: diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h index 263ab191d8a..dc7b81b3899 100644 --- a/libraries/FS/src/FSImpl.h +++ b/libraries/FS/src/FSImpl.h @@ -45,6 +45,7 @@ class FileImpl virtual FileImplPtr openNextFile(const char* mode) = 0; virtual boolean seekDir(long position); virtual String getNextFileName(void); + virtual String getNextFileName(bool *isDir); 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 e65a537c03d..1dd8da94ac9 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -540,6 +540,32 @@ String VFSFileImpl::getNextFileName() return name; } +String VFSFileImpl::getNextFileName(bool *isDir) +{ + 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; + + // check entry is a directory + if (isDir) { + *isDir = (file->d_type == DT_DIR); + } + 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 fe475bd35cb..ae2a4d0055c 100644 --- a/libraries/FS/src/vfs_api.h +++ b/libraries/FS/src/vfs_api.h @@ -73,6 +73,7 @@ class VFSFileImpl : public FileImpl boolean isDirectory(void) override; boolean seekDir(long position) override; String getNextFileName(void) override; + String getNextFileName(bool *isDir) override; FileImplPtr openNextFile(const char* mode) override; void rewindDirectory(void) override; operator bool();