diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp index ab4f5d5..8a0e359 100644 --- a/libraries/FS/src/FS.cpp +++ b/libraries/FS/src/FS.cpp @@ -169,6 +169,16 @@ File File::openNextFile(const char* mode) return _p->openNextFile(mode); } + +char *File::getNextFileName() +{ + if (!_p) { + return NULL; + } + return _p->getNextFileName(); + +} + void File::rewindDirectory(void) { if (!_p) { diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h index d63fc5d..b20fe7f 100644 --- a/libraries/FS/src/FS.h +++ b/libraries/FS/src/FS.h @@ -77,6 +77,8 @@ public: boolean isDirectory(void); File openNextFile(const char* mode = FILE_READ); + char *getNextFileName(); + void rewindDirectory(void); protected: diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h index 70e5cb1..8c5bf01 100644 --- a/libraries/FS/src/FSImpl.h +++ b/libraries/FS/src/FSImpl.h @@ -41,6 +41,8 @@ public: virtual const char* name() const = 0; virtual boolean isDirectory(void) = 0; virtual FileImplPtr openNextFile(const char* mode) = 0; + virtual char *getNextFileName(); + 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 6502f76..a0581ab 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -405,6 +405,40 @@ FileImplPtr VFSFileImpl::openNextFile(const char* mode) return std::make_shared(_fs, name.c_str(), mode); } + +/* +A clumsy hack. Memory is unmanaged, remember to free the return value +*/ +char *VFSFileImpl::getNextFileName() +{ + if(!_isDirectory || !_d) { + return NULL; + } + struct dirent *file = readdir(_d); + if(file == NULL) { + return NULL; + } + if(file->d_type != DT_REG && file->d_type != DT_DIR) { + abort(); + // return openNextFile(mode); + } + String fname = String(file->d_name); + String name = String(_path); + if(!fname.startsWith("/") && !name.endsWith("/")) { + name += "/"; + } + name += fname; + + char *out = (char *)malloc(strlen(name.c_str()) + 1); + if (out) + { + strcpy(out, name.c_str()); + return out; + } + else + return NULL; +} + void VFSFileImpl::rewindDirectory(void) { if(!_isDirectory || !_d) { diff --git a/libraries/FS/src/vfs_api.h b/libraries/FS/src/vfs_api.h index c564913..9a7ef5b 100644 --- a/libraries/FS/src/vfs_api.h +++ b/libraries/FS/src/vfs_api.h @@ -69,6 +69,7 @@ public: const char* name() const override; time_t getLastWrite() override; boolean isDirectory(void) override; + char *getNextFileName() override; FileImplPtr openNextFile(const char* mode) override; void rewindDirectory(void) override; operator bool();