diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index e43b4397452..9e200a1500b 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -13,9 +13,12 @@ // limitations under the License. #include "vfs_api.h" +#include using namespace fs; +#define READ_SIZE_SWITCH 128 //swithc to read func when read size > 128bytes + FileImplPtr VFSImpl::open(const char* fpath, const char* mode, const bool create) { if(!_mountpoint) { @@ -374,7 +377,28 @@ size_t VFSFileImpl::read(uint8_t* buf, size_t size) return 0; } - return fread(buf, 1, size, _f); + //ERASE BYTEBUFFER and use read when size > READ_SIZE_SWITCH always + if(size > READ_SIZE_SWITCH) + { + //check some data in buffer exists –> clear buffer and move pointer to deleted data + size_t bytesinbuf = __fpending(_f); + if (bytesinbuf && (bytesinbuf != 128)) //buffer lenght is 128 bytes + { + fpurge(_f); + lseek(fileno(_f),(-128+bytesinbuf),SEEK_CUR); + } + + int res = ::read(fileno(_f), buf, size); + if (res < 0) { + // an error occurred + return 0; + } + return res; + } + else + { + return fread(buf, 1, size, _f); + } } void VFSFileImpl::flush()