From f6c9faf4daeff4ac6bcfafd55dbb1fb922b304ed Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 15 Apr 2021 17:25:01 +0300 Subject: [PATCH] [2.0.0] FS::name() returns the item name as in Arduino SD (#4892) * FS::name() returns the item name as in Arduino SD Added method FS::path() that returns the full path * Adjust examples --- .../FFat/examples/FFat_Test/FFat_Test.ino | 2 +- .../FFat/examples/FFat_time/FFat_time.ino | 2 +- libraries/FS/src/FS.cpp | 9 +++ libraries/FS/src/FS.h | 1 + libraries/FS/src/FSImpl.h | 1 + libraries/FS/src/vfs_api.cpp | 73 ++++++++++--------- libraries/FS/src/vfs_api.h | 1 + .../examples/LITTLEFS_test/LITTLEFS_test.ino | 2 +- .../examples/LITTLEFS_time/LITTLEFS_time.ino | 2 +- libraries/SD/examples/SD_Test/SD_Test.ino | 2 +- libraries/SD/examples/SD_time/SD_time.ino | 2 +- .../SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino | 2 +- .../SD_MMC/examples/SDMMC_time/SDMMC_time.ino | 2 +- .../examples/SPIFFS_Test/SPIFFS_Test.ino | 2 +- .../examples/SPIFFS_time/SPIFFS_time.ino | 2 +- .../examples/FSBrowser/FSBrowser.ino | 2 +- .../examples/SDWebServer/SDWebServer.ino | 2 +- 17 files changed, 63 insertions(+), 46 deletions(-) diff --git a/libraries/FFat/examples/FFat_Test/FFat_Test.ino b/libraries/FFat/examples/FFat_Test/FFat_Test.ino index 26a0bcac..9ae55a8c 100644 --- a/libraries/FFat/examples/FFat_Test/FFat_Test.ino +++ b/libraries/FFat/examples/FFat_Test/FFat_Test.ino @@ -27,7 +27,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ Serial.print(" DIR : "); Serial.println(file.name()); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/FFat/examples/FFat_time/FFat_time.ino b/libraries/FFat/examples/FFat_time/FFat_time.ino index 1e379451..475cfea0 100644 --- a/libraries/FFat/examples/FFat_time/FFat_time.ino +++ b/libraries/FFat/examples/FFat_time/FFat_time.ino @@ -31,7 +31,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ struct tm * tmstruct = localtime(&t); Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp index 3bfcd54f..3050ec41 100644 --- a/libraries/FS/src/FS.cpp +++ b/libraries/FS/src/FS.cpp @@ -143,6 +143,15 @@ File::operator bool() const return _p != nullptr && *_p != false; } +const char* File::path() const +{ + if (!*this) { + return nullptr; + } + + return _p->path(); +} + const char* File::name() const { if (!*this) { diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h index d63fc5da..2c4aa301 100644 --- a/libraries/FS/src/FS.h +++ b/libraries/FS/src/FS.h @@ -73,6 +73,7 @@ public: void close(); operator bool() const; time_t getLastWrite(); + const char* path() const; const char* name() const; boolean isDirectory(void); diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h index 70e5cb1e..51c5915a 100644 --- a/libraries/FS/src/FSImpl.h +++ b/libraries/FS/src/FSImpl.h @@ -38,6 +38,7 @@ public: virtual size_t size() const = 0; virtual void close() = 0; virtual time_t getLastWrite() = 0; + virtual const char* path() const = 0; virtual const char* name() const = 0; virtual boolean isDirectory(void) = 0; virtual FileImplPtr openNextFile(const char* mode) = 0; diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index 346b7a93..aea37b1e 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -16,41 +16,41 @@ using namespace fs; -FileImplPtr VFSImpl::open(const char* path, const char* mode) +FileImplPtr VFSImpl::open(const char* fpath, const char* mode) { if(!_mountpoint) { log_e("File system is not mounted"); return FileImplPtr(); } - if(!path || path[0] != '/') { - log_e("%s does not start with /", path); + if(!fpath || fpath[0] != '/') { + log_e("%s does not start with /", fpath); return FileImplPtr(); } - char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+2); + char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+2); if(!temp) { log_e("malloc failed"); return FileImplPtr(); } - sprintf(temp,"%s%s", _mountpoint, path); + sprintf(temp,"%s%s", _mountpoint, fpath); struct stat st; //file lound if(!stat(temp, &st)) { free(temp); if (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode)) { - return std::make_shared(this, path, mode); + return std::make_shared(this, fpath, mode); } - log_e("%s has wrong mode 0x%08X", path, st.st_mode); + log_e("%s has wrong mode 0x%08X", fpath, st.st_mode); return FileImplPtr(); } //file not found but mode permits creation if(mode && mode[0] != 'r') { free(temp); - return std::make_shared(this, path, mode); + return std::make_shared(this, fpath, mode); } //try to open this as directory (might be mount point) @@ -58,7 +58,7 @@ FileImplPtr VFSImpl::open(const char* path, const char* mode) if(d) { closedir(d); free(temp); - return std::make_shared(this, path, mode); + return std::make_shared(this, fpath, mode); } log_e("%s does not exist", temp); @@ -66,14 +66,14 @@ FileImplPtr VFSImpl::open(const char* path, const char* mode) return FileImplPtr(); } -bool VFSImpl::exists(const char* path) +bool VFSImpl::exists(const char* fpath) { if(!_mountpoint) { log_e("File system is not mounted"); return false; } - VFSFileImpl f(this, path, "r"); + VFSFileImpl f(this, fpath, "r"); if(f) { f.close(); return true; @@ -115,69 +115,69 @@ bool VFSImpl::rename(const char* pathFrom, const char* pathTo) return rc == 0; } -bool VFSImpl::remove(const char* path) +bool VFSImpl::remove(const char* fpath) { if(!_mountpoint) { log_e("File system is not mounted"); return false; } - if(!path || path[0] != '/') { + if(!fpath || fpath[0] != '/') { log_e("bad arguments"); return false; } - VFSFileImpl f(this, path, "r"); + VFSFileImpl f(this, fpath, "r"); if(!f || f.isDirectory()) { if(f) { f.close(); } - log_e("%s does not exists or is directory", path); + log_e("%s does not exists or is directory", fpath); return false; } f.close(); - char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+1); + char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+1); if(!temp) { log_e("malloc failed"); return false; } - sprintf(temp,"%s%s", _mountpoint, path); + sprintf(temp,"%s%s", _mountpoint, fpath); auto rc = unlink(temp); free(temp); return rc == 0; } -bool VFSImpl::mkdir(const char *path) +bool VFSImpl::mkdir(const char *fpath) { if(!_mountpoint) { log_e("File system is not mounted"); return false; } - VFSFileImpl f(this, path, "r"); + VFSFileImpl f(this, fpath, "r"); if(f && f.isDirectory()) { f.close(); - //log_w("%s already exists", path); + //log_w("%s already exists", fpath); return true; } else if(f) { f.close(); - log_e("%s is a file", path); + log_e("%s is a file", fpath); return false; } - char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+1); + char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+1); if(!temp) { log_e("malloc failed"); return false; } - sprintf(temp,"%s%s", _mountpoint, path); + sprintf(temp,"%s%s", _mountpoint, fpath); auto rc = ::mkdir(temp, ACCESSPERMS); free(temp); return rc == 0; } -bool VFSImpl::rmdir(const char *path) +bool VFSImpl::rmdir(const char *fpath) { if(!_mountpoint) { log_e("File system is not mounted"); @@ -189,22 +189,22 @@ bool VFSImpl::rmdir(const char *path) return false; } - VFSFileImpl f(this, path, "r"); + VFSFileImpl f(this, fpath, "r"); if(!f || !f.isDirectory()) { if(f) { f.close(); } - log_e("%s does not exists or is a file", path); + log_e("%s does not exists or is a file", fpath); return false; } f.close(); - char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+1); + char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+1); if(!temp) { log_e("malloc failed"); return false; } - sprintf(temp,"%s%s", _mountpoint, path); + sprintf(temp,"%s%s", _mountpoint, fpath); auto rc = ::rmdir(temp); free(temp); return rc == 0; @@ -213,7 +213,7 @@ bool VFSImpl::rmdir(const char *path) -VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* path, const char* mode) +VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* fpath, const char* mode) : _fs(fs) , _f(NULL) , _d(NULL) @@ -221,15 +221,15 @@ VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* path, const char* mode) , _isDirectory(false) , _written(false) { - char * temp = (char *)malloc(strlen(path)+strlen(_fs->_mountpoint)+1); + char * temp = (char *)malloc(strlen(fpath)+strlen(_fs->_mountpoint)+1); if(!temp) { return; } - sprintf(temp,"%s%s", _fs->_mountpoint, path); + sprintf(temp,"%s%s", _fs->_mountpoint, fpath); - _path = strdup(path); + _path = strdup(fpath); if(!_path) { - log_e("strdup(%s) failed", path); + log_e("strdup(%s) failed", fpath); free(temp); return; } @@ -377,11 +377,16 @@ size_t VFSFileImpl::size() const return _stat.st_size; } -const char* VFSFileImpl::name() const +const char* VFSFileImpl::path() const { return (const char*) _path; } +const char* VFSFileImpl::name() const +{ + return pathToFileName(path()); +} + //to implement boolean VFSFileImpl::isDirectory(void) { diff --git a/libraries/FS/src/vfs_api.h b/libraries/FS/src/vfs_api.h index c5649130..58fd86fd 100644 --- a/libraries/FS/src/vfs_api.h +++ b/libraries/FS/src/vfs_api.h @@ -66,6 +66,7 @@ public: size_t position() const override; size_t size() const override; void close() override; + const char* path() const override; const char* name() const override; time_t getLastWrite() override; boolean isDirectory(void) override; diff --git a/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino b/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino index f905511d..4d594ea9 100644 --- a/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino +++ b/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino @@ -32,7 +32,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ Serial.print(" DIR : "); Serial.println(file.name()); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino b/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino index d4f4aaf1..3f03c227 100644 --- a/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino +++ b/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino @@ -43,7 +43,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ struct tm * tmstruct = localtime(&t); Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/SD/examples/SD_Test/SD_Test.ino b/libraries/SD/examples/SD_Test/SD_Test.ino index 6059446e..8084ee17 100644 --- a/libraries/SD/examples/SD_Test/SD_Test.ino +++ b/libraries/SD/examples/SD_Test/SD_Test.ino @@ -35,7 +35,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ Serial.print(" DIR : "); Serial.println(file.name()); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/SD/examples/SD_time/SD_time.ino b/libraries/SD/examples/SD_time/SD_time.ino index 5fc87162..cef80dd6 100644 --- a/libraries/SD/examples/SD_time/SD_time.ino +++ b/libraries/SD/examples/SD_time/SD_time.ino @@ -47,7 +47,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ struct tm * tmstruct = localtime(&t); Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino b/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino index b9e87285..024ea4bf 100644 --- a/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino +++ b/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino @@ -35,7 +35,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ Serial.print(" DIR : "); Serial.println(file.name()); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino b/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino index 43dad454..4472f8c6 100644 --- a/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino +++ b/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino @@ -47,7 +47,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ struct tm * tmstruct = localtime(&t); Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino b/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino index 15a71245..9ee67e6c 100644 --- a/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino +++ b/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino @@ -25,7 +25,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ Serial.print(" DIR : "); Serial.println(file.name()); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino b/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino index 958e805e..a8675969 100644 --- a/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino +++ b/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino @@ -31,7 +31,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ struct tm * tmstruct = localtime(&t); Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); if(levels){ - listDir(fs, file.name(), levels -1); + listDir(fs, file.path(), levels -1); } } else { Serial.print(" FILE: "); diff --git a/libraries/WebServer/examples/FSBrowser/FSBrowser.ino b/libraries/WebServer/examples/FSBrowser/FSBrowser.ino index f33f5dbe..093ff08b 100644 --- a/libraries/WebServer/examples/FSBrowser/FSBrowser.ino +++ b/libraries/WebServer/examples/FSBrowser/FSBrowser.ino @@ -207,7 +207,7 @@ void handleFileList() { output += "{\"type\":\""; output += (file.isDirectory()) ? "dir" : "file"; output += "\",\"name\":\""; - output += String(file.name()).substring(1); + output += String(file.path()).substring(1); output += "\"}"; file = root.openNextFile(); } diff --git a/libraries/WebServer/examples/SDWebServer/SDWebServer.ino b/libraries/WebServer/examples/SDWebServer/SDWebServer.ino index 3d0e3942..9e0b8456 100644 --- a/libraries/WebServer/examples/SDWebServer/SDWebServer.ino +++ b/libraries/WebServer/examples/SDWebServer/SDWebServer.ino @@ -229,7 +229,7 @@ void printDirectory() { output += "{\"type\":\""; output += (entry.isDirectory()) ? "dir" : "file"; output += "\",\"name\":\""; - output += entry.name(); + output += entry.path(); output += "\""; output += "}"; server.sendContent(output);