From 6e36badb92d35b6fdeafd4e20438fa269ac15e3c Mon Sep 17 00:00:00 2001 From: Lucas Machado Date: Tue, 6 Sep 2022 10:23:57 -0300 Subject: [PATCH 1/2] Implements seekDir and getNextFileName on FS lib to improve performance --- libraries/FS/src/FS.cpp | 16 ++++++++++++++++ libraries/FS/src/FS.h | 2 ++ libraries/FS/src/FSImpl.h | 2 ++ libraries/FS/src/vfs_api.cpp | 35 +++++++++++++++++++++++++++++++++++ libraries/FS/src/vfs_api.h | 2 ++ 5 files changed, 57 insertions(+) diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp index 80d0958a759..4cd565933b3 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); +} + +boolean File::getNextFileName(String &filename) +{ + if (!_p) { + return NULL; + } + return _p->getNextFileName(filename); + +} + void File::rewindDirectory(void) { if (!*this) { diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h index 64e630c4577..2caa394eb86 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); + boolean getNextFileName(String &filename); void rewindDirectory(void); protected: diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h index bb20cd499ae..e8570bd61a7 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 boolean getNextFileName(String &filename); 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..0a4469fe1d1 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -476,6 +476,41 @@ 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; +} + + +boolean VFSFileImpl::getNextFileName(String &filename) +{ + if (!_isDirectory || !_d) { + return false; + } + struct dirent *file = readdir(_d); + if (file == NULL) { + return false; + } + if (file->d_type != DT_REG && file->d_type != DT_DIR) { + return false; + } + String fname = String(file->d_name); + String name = String(_path); + if (!fname.startsWith("/") && !name.endsWith("/")) { + name += "/"; + } + name += fname; + if (name.length() > 0) { + filename = name; + return true; + } else { + return false; + } +} + 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..15d18bebfff 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; + boolean getNextFileName(String &filename) override; FileImplPtr openNextFile(const char* mode) override; void rewindDirectory(void) override; operator bool(); From bfdeb976a5761af75bf0072aff5696577ae6b482 Mon Sep 17 00:00:00 2001 From: Lucas Machado Date: Thu, 22 Sep 2022 17:21:21 -0300 Subject: [PATCH 2/2] getNextFileName return String directly --- libraries/FS/src/FS.cpp | 6 +++--- libraries/FS/src/FS.h | 2 +- libraries/FS/src/FSImpl.h | 2 +- libraries/FS/src/vfs_api.cpp | 15 +++++---------- libraries/FS/src/vfs_api.h | 2 +- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp index 4cd565933b3..8d89b1c1e5e 100644 --- a/libraries/FS/src/FS.cpp +++ b/libraries/FS/src/FS.cpp @@ -194,12 +194,12 @@ boolean File::seekDir(long position){ return _p->seekDir(position); } -boolean File::getNextFileName(String &filename) +String File::getNextFileName(void) { if (!_p) { - return NULL; + return ""; } - return _p->getNextFileName(filename); + return _p->getNextFileName(); } diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h index 2caa394eb86..95e6f265deb 100644 --- a/libraries/FS/src/FS.h +++ b/libraries/FS/src/FS.h @@ -80,7 +80,7 @@ class File : public Stream boolean isDirectory(void); boolean seekDir(long position); File openNextFile(const char* mode = FILE_READ); - boolean getNextFileName(String &filename); + String getNextFileName(void); void rewindDirectory(void); protected: diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h index e8570bd61a7..263ab191d8a 100644 --- a/libraries/FS/src/FSImpl.h +++ b/libraries/FS/src/FSImpl.h @@ -44,7 +44,7 @@ class FileImpl virtual boolean isDirectory(void) = 0; virtual FileImplPtr openNextFile(const char* mode) = 0; virtual boolean seekDir(long position); - virtual boolean getNextFileName(String &filename); + 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 0a4469fe1d1..ab7dccb7599 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -485,17 +485,17 @@ boolean VFSFileImpl::seekDir(long position){ } -boolean VFSFileImpl::getNextFileName(String &filename) +String VFSFileImpl::getNextFileName() { if (!_isDirectory || !_d) { - return false; + return ""; } struct dirent *file = readdir(_d); if (file == NULL) { - return false; + return ""; } if (file->d_type != DT_REG && file->d_type != DT_DIR) { - return false; + return ""; } String fname = String(file->d_name); String name = String(_path); @@ -503,12 +503,7 @@ boolean VFSFileImpl::getNextFileName(String &filename) name += "/"; } name += fname; - if (name.length() > 0) { - filename = name; - return true; - } else { - return false; - } + return name; } void VFSFileImpl::rewindDirectory(void) diff --git a/libraries/FS/src/vfs_api.h b/libraries/FS/src/vfs_api.h index 15d18bebfff..fe475bd35cb 100644 --- a/libraries/FS/src/vfs_api.h +++ b/libraries/FS/src/vfs_api.h @@ -72,7 +72,7 @@ class VFSFileImpl : public FileImpl time_t getLastWrite() override; boolean isDirectory(void) override; boolean seekDir(long position) override; - boolean getNextFileName(String &filename) override; + String getNextFileName(void) override; FileImplPtr openNextFile(const char* mode) override; void rewindDirectory(void) override; operator bool();