mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-06 05:21:22 +03:00
Add FS::info64 call for filesystems > 4GB (#6154)
Fixes #6082 Add an info64() call which returns used and total sizes as 64 bit quantities. A default wrapper that just copies the 32-bit values is included for LittleFS/SPIFFS which can't hit those capacities.
This commit is contained in:
parent
69311c8fe1
commit
44bda41cf6
@ -283,6 +283,13 @@ bool FS::info(FSInfo& info){
|
|||||||
return _impl->info(info);
|
return _impl->info(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FS::info64(FSInfo64& info){
|
||||||
|
if (!_impl) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return _impl->info64(info);
|
||||||
|
}
|
||||||
|
|
||||||
File FS::open(const String& path, const char* mode) {
|
File FS::open(const String& path, const char* mode) {
|
||||||
return open(path.c_str(), mode);
|
return open(path.c_str(), mode);
|
||||||
}
|
}
|
||||||
|
@ -137,6 +137,7 @@ protected:
|
|||||||
FS *_baseFS;
|
FS *_baseFS;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Backwards compatible, <4GB filesystem usage
|
||||||
struct FSInfo {
|
struct FSInfo {
|
||||||
size_t totalBytes;
|
size_t totalBytes;
|
||||||
size_t usedBytes;
|
size_t usedBytes;
|
||||||
@ -146,6 +147,17 @@ struct FSInfo {
|
|||||||
size_t maxPathLength;
|
size_t maxPathLength;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Support > 4GB filesystems (SD, etc.)
|
||||||
|
struct FSInfo64 {
|
||||||
|
uint64_t totalBytes;
|
||||||
|
uint64_t usedBytes;
|
||||||
|
size_t blockSize;
|
||||||
|
size_t pageSize;
|
||||||
|
size_t maxOpenFiles;
|
||||||
|
size_t maxPathLength;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class FSConfig
|
class FSConfig
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -186,6 +198,7 @@ public:
|
|||||||
|
|
||||||
bool format();
|
bool format();
|
||||||
bool info(FSInfo& info);
|
bool info(FSInfo& info);
|
||||||
|
bool info64(FSInfo64& info);
|
||||||
|
|
||||||
File open(const char* path, const char* mode);
|
File open(const char* path, const char* mode);
|
||||||
File open(const String& path, const char* mode);
|
File open(const String& path, const char* mode);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <FS.h>
|
||||||
|
|
||||||
namespace fs {
|
namespace fs {
|
||||||
|
|
||||||
@ -75,6 +76,7 @@ public:
|
|||||||
virtual void end() = 0;
|
virtual void end() = 0;
|
||||||
virtual bool format() = 0;
|
virtual bool format() = 0;
|
||||||
virtual bool info(FSInfo& info) = 0;
|
virtual bool info(FSInfo& info) = 0;
|
||||||
|
virtual bool info64(FSInfo64& info) = 0;
|
||||||
virtual FileImplPtr open(const char* path, OpenMode openMode, AccessMode accessMode) = 0;
|
virtual FileImplPtr open(const char* path, OpenMode openMode, AccessMode accessMode) = 0;
|
||||||
virtual bool exists(const char* path) = 0;
|
virtual bool exists(const char* path) = 0;
|
||||||
virtual DirImplPtr openDir(const char* path) = 0;
|
virtual DirImplPtr openDir(const char* path) = 0;
|
||||||
|
@ -85,7 +85,6 @@ public:
|
|||||||
|
|
||||||
bool info(FSInfo& info) override
|
bool info(FSInfo& info) override
|
||||||
{
|
{
|
||||||
info.maxOpenFiles = _maxOpenFds;
|
|
||||||
info.blockSize = _blockSize;
|
info.blockSize = _blockSize;
|
||||||
info.pageSize = _pageSize;
|
info.pageSize = _pageSize;
|
||||||
info.maxOpenFiles = _maxOpenFds;
|
info.maxOpenFiles = _maxOpenFds;
|
||||||
@ -101,6 +100,20 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool info64(FSInfo64& info64) {
|
||||||
|
FSInfo i;
|
||||||
|
if (!info(i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
info64.blockSize = i.blockSize;
|
||||||
|
info64.pageSize = i.pageSize;
|
||||||
|
info64.maxOpenFiles = i.maxOpenFiles;
|
||||||
|
info64.maxPathLength = i.maxPathLength;
|
||||||
|
info64.totalBytes = i.totalBytes;
|
||||||
|
info64.usedBytes = i.usedBytes;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool remove(const char* path) override
|
bool remove(const char* path) override
|
||||||
{
|
{
|
||||||
if (!isSpiffsFilenameValid(path)) {
|
if (!isSpiffsFilenameValid(path)) {
|
||||||
|
@ -126,6 +126,20 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool info64(FSInfo64& info64) {
|
||||||
|
FSInfo i;
|
||||||
|
if (!info(i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
info64.blockSize = i.blockSize;
|
||||||
|
info64.pageSize = i.pageSize;
|
||||||
|
info64.maxOpenFiles = i.maxOpenFiles;
|
||||||
|
info64.maxPathLength = i.maxPathLength;
|
||||||
|
info64.totalBytes = i.totalBytes;
|
||||||
|
info64.usedBytes = i.usedBytes;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool remove(const char* path) override {
|
bool remove(const char* path) override {
|
||||||
if (!_mounted || !path || !path[0]) {
|
if (!_mounted || !path || !path[0]) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -94,7 +94,7 @@ public:
|
|||||||
|
|
||||||
FileImplPtr open(const char* path, OpenMode openMode, AccessMode accessMode) override;
|
FileImplPtr open(const char* path, OpenMode openMode, AccessMode accessMode) override;
|
||||||
|
|
||||||
bool exists(const char* path) {
|
bool exists(const char* path) override {
|
||||||
return _mounted ? _fs.exists(path) : false;
|
return _mounted ? _fs.exists(path) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ public:
|
|||||||
return _mounted ? _fs.rename(pathFrom, pathTo) : false;
|
return _mounted ? _fs.rename(pathFrom, pathTo) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool info(FSInfo& info) override {
|
bool info64(FSInfo64& info) override {
|
||||||
if (!_mounted) {
|
if (!_mounted) {
|
||||||
DEBUGV("SDFS::info: FS not mounted\n");
|
DEBUGV("SDFS::info: FS not mounted\n");
|
||||||
return false;
|
return false;
|
||||||
@ -113,8 +113,28 @@ public:
|
|||||||
info.blockSize = _fs.vol()->blocksPerCluster() * 512;
|
info.blockSize = _fs.vol()->blocksPerCluster() * 512;
|
||||||
info.pageSize = 0; // TODO ?
|
info.pageSize = 0; // TODO ?
|
||||||
info.maxPathLength = 255; // TODO ?
|
info.maxPathLength = 255; // TODO ?
|
||||||
info.totalBytes =_fs.vol()->volumeBlockCount() * 512;
|
info.totalBytes =_fs.vol()->volumeBlockCount() * 512LL;
|
||||||
info.usedBytes = info.totalBytes - (_fs.vol()->freeClusterCount() * _fs.vol()->blocksPerCluster() * 512);
|
info.usedBytes = info.totalBytes - (_fs.vol()->freeClusterCount() * _fs.vol()->blocksPerCluster() * 512LL);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool info(FSInfo& info) override {
|
||||||
|
FSInfo64 i;
|
||||||
|
if (!info64(i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
info.blockSize = i.blockSize;
|
||||||
|
info.pageSize = i.pageSize;
|
||||||
|
info.maxOpenFiles = i.maxOpenFiles;
|
||||||
|
info.maxPathLength = i.maxPathLength;
|
||||||
|
#ifdef DEBUG_ESP_PORT
|
||||||
|
if (i.totalBytes > (uint64_t)SIZE_MAX) {
|
||||||
|
// This catches both total and used cases, since used must always be < total.
|
||||||
|
DEBUG_ESP_PORT.printf_P(PSTR("WARNING: SD card size overflow (%lld>= 4GB). Please update source to use info64().\n"), i.totalBytes);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
info.totalBytes = (size_t)i.totalBytes;
|
||||||
|
info.usedBytes = (size_t)i.usedBytes;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user