From 3a1ff544d6f5084464c868f79a73621ea8f3d16e Mon Sep 17 00:00:00 2001 From: tueddy Date: Wed, 12 Apr 2023 15:53:03 +0200 Subject: [PATCH 1/3] getNextFileName(boolean *isDir): get info if filename is a file or directory --- libraries/FS/src/FS.cpp | 9 +++++++++ libraries/FS/src/FS.h | 1 + libraries/FS/src/FSImpl.h | 1 + libraries/FS/src/vfs_api.cpp | 23 +++++++++++++++++++++++ libraries/FS/src/vfs_api.h | 1 + 5 files changed, 35 insertions(+) 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..b654218ad3d 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -540,6 +540,29 @@ 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 + *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(); From 3cfdd335c9cfa3acf1ba19c3dcffd22f70b190fd Mon Sep 17 00:00:00 2001 From: tueddy Date: Fri, 14 Apr 2023 09:39:31 +0200 Subject: [PATCH 2/3] additional check isDir assigned --- libraries/FS/src/vfs_api.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index b654218ad3d..a162d0de9aa 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -559,7 +559,9 @@ String VFSFileImpl::getNextFileName(bool *isDir) } name += fname; // check entry is a directory - *isDir = (file->d_type == DT_DIR); + if(isDir) { + *isDir = (file->d_type == DT_DIR); + } return name; } From f6ec53cf0e360ab025016ebe309617120c7aa3f4 Mon Sep 17 00:00:00 2001 From: tueddy Date: Fri, 14 Apr 2023 10:54:39 +0200 Subject: [PATCH 3/3] code formatting --- libraries/FS/src/vfs_api.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index a162d0de9aa..1dd8da94ac9 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -558,10 +558,11 @@ String VFSFileImpl::getNextFileName(bool *isDir) name += "/"; } name += fname; - // check entry is a directory - if(isDir) { - *isDir = (file->d_type == DT_DIR); - } + + // check entry is a directory + if (isDir) { + *isDir = (file->d_type == DT_DIR); + } return name; }