Core/FileSystem.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * FileSystem.h
8  *
9  ****/
10 
16 #pragma once
17 
18 #include <IFS/Helpers.h>
19 #include <IFS/File.h>
20 #include <IFS/Directory.h>
21 #include <spiffs_sming.h>
22 #include "WVector.h"
23 
34 constexpr int FS_OK = IFS::FS_OK;
35 
39 
40 namespace SmingInternal
41 {
51 
52 } // namespace SmingInternal
53 
54 class File : public IFS::File
55 {
56 public:
58  {
59  }
60 };
61 
66 class Directory : public IFS::Directory
67 {
68 public:
70  {
71  }
72 };
73 
74 // Various file flag combinations
82 
83 /*
84  * Boilerplate check for file function wrappers to catch undefined filesystem.
85  */
86 #define CHECK_FS(_method) \
87  auto fileSystem = static_cast<IFS::FileSystem*>(SmingInternal::activeFileSystem); \
88  if(fileSystem == nullptr) { \
89  debug_e("ERROR in %s(): No active file system", __FUNCTION__); \
90  return file_t(IFS::Error::NoFileSystem); \
91  }
92 
98 {
99  if(SmingInternal::activeFileSystem == nullptr) {
100  debug_e("ERROR: No active file system");
101  }
102  return static_cast<IFS::FileSystem*>(SmingInternal::activeFileSystem);
103 }
104 
113 void fileSetFileSystem(IFS::IFileSystem* fileSystem);
114 
115 inline void fileFreeFileSystem()
116 {
117  fileSetFileSystem(nullptr);
118 }
119 
124 bool spiffs_mount();
125 
129 bool spiffs_mount(Storage::Partition partition);
130 
135 bool fwfs_mount();
136 
141 bool fwfs_mount(Storage::Partition partition);
142 
147 bool hyfs_mount();
148 
153 bool hyfs_mount(Storage::Partition fwfsPartition, Storage::Partition spiffsPartition);
154 
160 inline file_t fileOpen(const char* name, FileOpenFlags flags = File::ReadOnly)
161 {
162  CHECK_FS(open)
163  return fileSystem->open(name, flags);
164 }
165 
166 inline file_t fileOpen(const String& name, FileOpenFlags flags = File::ReadOnly)
167 {
168  return fileOpen(name.c_str(), flags);
169 }
170 
172 {
173  CHECK_FS(fopen)
174  return fileSystem->fopen(stat, flags);
175 }
176 
181 inline int fileClose(file_t file)
182 {
183  CHECK_FS(close)
184  return fileSystem->close(file);
185 }
186 
193 inline int fileWrite(file_t file, const void* data, size_t size)
194 {
195  CHECK_FS(write);
196  return fileSystem->write(file, data, size);
197 }
198 
203 inline int fileTouch(file_t file)
204 {
205  return fileWrite(file, nullptr, 0);
206 }
207 
214 inline int fileRead(file_t file, void* data, size_t size)
215 {
216  CHECK_FS(read)
217  return fileSystem->read(file, data, size);
218 }
219 
226 inline int fileSeek(file_t file, int offset, SeekOrigin origin)
227 {
228  CHECK_FS(seek)
229  return fileSystem->lseek(file, offset, origin);
230 }
231 
236 inline bool fileIsEOF(file_t file)
237 {
238  auto fileSystem = getFileSystem();
239  return fileSystem ? (fileSystem->eof(file) != 0) : true;
240 }
241 
246 inline int fileTell(file_t file)
247 {
248  CHECK_FS(tell)
249  return fileSystem->tell(file);
250 }
251 
256 inline int fileFlush(file_t file)
257 {
258  CHECK_FS(flush)
259  return fileSystem->flush(file);
260 }
261 
266 inline String fileGetErrorString(int err)
267 {
268  auto fileSystem = getFileSystem();
269  if(fileSystem == nullptr) {
270  return IFS::Error::toString(err);
271  }
272  return fileSystem->getErrorString(err);
273 }
274 
283 template <typename TFileName> inline int fileSetContent(const TFileName& fileName, const char* content, size_t length)
284 {
285  CHECK_FS(setContent)
286  return fileSystem->setContent(fileName, content, length);
287 }
288 
289 template <typename TFileName, typename TContent> inline int fileSetContent(const TFileName& fileName, TContent content)
290 {
291  CHECK_FS(setContent)
292  return fileSystem->setContent(fileName, content);
293 }
294 
299 template <typename TFileName> inline uint32_t fileGetSize(const TFileName& fileName)
300 {
301  auto fileSystem = getFileSystem();
302  return fileSystem ? fileSystem->getSize(fileName) : 0;
303 }
304 
312 inline int fileTruncate(file_t file, size_t newSize)
313 {
314  CHECK_FS(truncate);
315  return fileSystem->ftruncate(file, newSize);
316 }
317 
322 inline int fileTruncate(file_t file)
323 {
324  CHECK_FS(truncate);
325  return fileSystem->ftruncate(file);
326 }
327 
335 template <typename TFileName> int fileTruncate(const TFileName& fileName, size_t newSize)
336 {
337  CHECK_FS(truncate);
338  return fileSystem->truncate(fileName, newSize);
339 }
340 
346 inline int fileRename(const char* oldName, const char* newName)
347 {
348  CHECK_FS(rename)
349  return fileSystem->rename(oldName, newName);
350 }
351 
352 inline int fileRename(const String& oldName, const String& newName)
353 {
354  return fileRename(oldName.c_str(), newName.c_str());
355 }
356 
363 
371 template <typename TFileName> String fileGetContent(const TFileName& fileName)
372 {
373  auto fileSystem = getFileSystem();
374  return fileSystem ? fileSystem->getContent(fileName) : nullptr;
375 }
376 
388 template <typename TFileName> inline size_t fileGetContent(const TFileName& fileName, char* buffer, size_t bufSize)
389 {
390  auto fileSystem = getFileSystem();
391  return fileSystem ? fileSystem->getContent(fileName, buffer, bufSize) : 0;
392 }
393 
394 template <typename TFileName> inline size_t fileGetContent(const TFileName& fileName, char* buffer)
395 {
396  auto fileSystem = getFileSystem();
397  return fileSystem ? fileSystem->getContent(fileName, buffer) : 0;
398 }
399 
405 inline int fileStats(const char* fileName, FileStat& stat)
406 {
407  CHECK_FS(stat)
408  return fileSystem->stat(fileName, &stat);
409 }
410 
411 inline int fileStats(const String& fileName, FileStat& stat)
412 {
413  return fileStats(fileName.c_str(), stat);
414 }
415 
421 inline int fileStats(file_t file, FileStat& stat)
422 {
423  CHECK_FS(fstat)
424  return fileSystem->fstat(file, &stat);
425 }
426 
431 inline int fileDelete(const char* fileName)
432 {
433  CHECK_FS(remove)
434  return fileSystem->remove(fileName);
435 }
436 
437 inline int fileDelete(const String& fileName)
438 {
439  return fileDelete(fileName.c_str());
440 }
441 
446 inline int fileDelete(file_t file)
447 {
448  CHECK_FS(fremove)
449  return fileSystem->fremove(file);
450 }
451 
456 inline bool fileExist(const char* fileName)
457 {
458  CHECK_FS(stat)
459  return fileSystem->stat(fileName, nullptr) >= 0;
460 }
461 
462 inline bool fileExist(const String& fileName)
463 {
464  return fileExist(fileName.c_str());
465 }
466 
473 inline int fileOpenDir(const char* dirName, DirHandle& dir)
474 {
475  CHECK_FS(opendir)
476  return fileSystem->opendir(dirName, dir);
477 }
478 
479 inline int fileOpenDir(const String& dirName, DirHandle& dir)
480 {
481  return fileOpenDir(dirName.c_str(), dir);
482 }
483 
484 inline int fileOpenRootDir(DirHandle& dir)
485 {
486  return fileOpenDir(nullptr, dir);
487 }
488 
494 inline int fileOpenDir(const FileStat& stat, DirHandle& dir)
495 {
496  CHECK_FS(opendir)
497  return fileSystem->fopendir(&stat, dir);
498 }
499 
504 inline int fileCloseDir(DirHandle dir)
505 {
506  CHECK_FS(closedir)
507  return fileSystem->closedir(dir);
508 }
509 
515 inline int fileReadDir(DirHandle dir, FileStat& stat)
516 {
517  CHECK_FS(readdir)
518  return fileSystem->readdir(dir, stat);
519 }
520 
525 inline int fileRewindDir(DirHandle dir)
526 {
527  CHECK_FS(rewinddir)
528  return fileSystem->rewinddir(dir);
529 }
530 
535 {
536  CHECK_FS(getinfo)
537  return fileSystem->getinfo(info);
538 }
539 
544 
548 inline int fileSystemFormat()
549 {
550  CHECK_FS(format)
551  return fileSystem->format();
552 }
553 
557 inline int fileSystemCheck()
558 {
559  CHECK_FS(check)
560  return fileSystem->check();
561 }
562 
568 inline int fileSetACL(file_t file, const IFS::ACL& acl)
569 {
570  CHECK_FS(setacl)
571  return fileSystem->setacl(file, acl);
572 }
573 
580 inline int fileSetAttr(const char* filename, FileAttributes attr)
581 {
582  CHECK_FS(setattr)
583  return fileSystem->setattr(filename, attr);
584 }
585 
586 inline int fileSetAttr(const String& filename, FileAttributes attr)
587 {
588  return fileSetAttr(filename.c_str(), attr);
589 }
597 inline int fileSetTime(file_t file, time_t mtime)
598 {
599  CHECK_FS(settime)
600  return fileSystem->settime(file, mtime);
601 }
602 
Definition: Core/FileSystem.h:40
Basic information about filing system.
Definition: IFileSystem.h:123
version of Stat with integrated name buffer
Definition: Stat.h:97
#define CHECK_FS(_method)
Definition: Core/FileSystem.h:86
constexpr FileOpenFlags eFO_Truncate
Definition: Core/FileSystem.h:80
virtual int write(FileHandle file, const void *data, size_t size)=0
write content to a file at current position and advance cursor
virtual int remove(const char *path)=0
remove (delete) a file by path
virtual int check()
Perform a file system consistency check.
Definition: IFileSystem.h:427
struct FileDir * DirHandle
Definition: IFileSystem.h:65
IFS::FileHandle file_t
<
Definition: Core/FileSystem.h:24
virtual int setacl(FileHandle file, const ACL &acl)=0
Set access control information for file.
virtual int close(FileHandle file)=0
close an open file
int fileTouch(file_t file)
Update file modification time.
Definition: Core/FileSystem.h:203
FileAttribute
Definition: FileAttributes.h:45
BitSet< uint8_t, OpenFlag, size_t(OpenFlag::MAX)> OpenFlags
Definition: OpenFlags.h:49
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:641
IFS::IFileSystem * activeFileSystem
Global file system instance.
Directory stream class.
Definition: Core/FileSystem.h:66
int fileClose(file_t file)
Clode file.
Definition: Core/FileSystem.h:181
virtual int setattr(const char *path, FileAttributes attr)=0
Set file attributes.
virtual int eof(FileHandle file)=0
determine if current file position is at end of file
int fileGetSystemInfo(IFS::IFileSystem::Info &info)
Get basic file system information.
Definition: Core/FileSystem.h:534
virtual int rename(const char *oldpath, const char *newpath)=0
rename a file
static constexpr OpenFlags Append
Definition: File.h:51
Installable File System base class.
Definition: IFileSystem.h:100
virtual FileHandle open(const char *path, OpenFlags flags)=0
open a file by name/path
int fileRead(file_t file, void *data, size_t size)
Read from file.
Definition: Core/FileSystem.h:214
int fileTell(file_t file)
Get position in file.
Definition: Core/FileSystem.h:246
SEEK_SET: Start of file.
IFS::IFileSystem::Type fileSystemType()
Get the type of file system currently mounted (if any)
static constexpr OpenFlags ReadWrite
Definition: File.h:49
constexpr SeekOrigin eSO_CurrentPos
Definition: Core/FileSystem.h:37
bool fileExist(const char *fileName)
Check if a file exists on file system.
Definition: Core/FileSystem.h:456
virtual int opendir(const char *path, DirHandle &dir)=0
open a directory for reading
static constexpr OpenFlags ReadOnly
Definition: File.h:47
int fileRename(const char *oldName, const char *newName)
Rename file.
Definition: Core/FileSystem.h:346
String fileGetErrorString(int err)
get the text for a returned error code
Definition: Core/FileSystem.h:266
String fileGetContent(const TFileName &fileName)
Read content of a file.
Definition: Core/FileSystem.h:371
BitSet< uint8_t, FileAttribute, size_t(FileAttribute::MAX)> FileAttributes
File attributes are stored as a bitmask.
Definition: FileAttributes.h:55
Wraps up all file access methods.
Definition: File.h:41
int fileRewindDir(DirHandle dir)
Rewind to start of directory entries.
Definition: Core/FileSystem.h:525
int fileTruncate(file_t file, size_t newSize)
Truncate (reduce) the size of an open file.
Definition: Core/FileSystem.h:312
constexpr SeekOrigin eSO_FileStart
Definition: Core/FileSystem.h:36
The String class.
Definition: WString.h:136
int fileCloseDir(DirHandle dir)
close a directory object
Definition: Core/FileSystem.h:504
virtual int fremove(FileHandle file)=0
remove (delete) a file by handle
Installable File System base class.
Definition: Components/IFS/src/include/IFS/FileSystem.h:39
SeekOrigin SeekOriginFlags
Definition: Core/FileSystem.h:25
Wrapper class for enumerating a directory.
Definition: Directory.h:31
file_t fileOpen(const char *name, FileOpenFlags flags=File::ReadOnly)
Open file.
Definition: Core/FileSystem.h:160
int fileSetTime(file_t file, time_t mtime)
Set access control information for file.
Definition: Core/FileSystem.h:597
SEEK_END: End of file.
bool fwfs_mount()
Mount the first available FWFS volume.
bool hyfs_mount()
Mount the first available FWFS and SPIFFS partitions as a hybrid filesystem.
SeekOrigin
Stream/file seek origins.
Definition: SeekOrigin.h:18
virtual int closedir(DirHandle dir)=0
close a directory object
static constexpr OpenFlags WriteOnly
Definition: File.h:48
uint32_t fileGetSize(const TFileName &fileName)
Get size of file.
Definition: Core/FileSystem.h:299
int fileSetAttr(const char *filename, FileAttributes attr)
Definition: Core/FileSystem.h:580
String toString(int err)
get text for an error code
int fileOpenDir(const char *dirName, DirHandle &dir)
Open a named directory for reading.
Definition: Core/FileSystem.h:473
int fileSeek(file_t file, int offset, SeekOrigin origin)
Position file cursor.
Definition: Core/FileSystem.h:226
int16_t FileHandle
File handle.
Definition: Stat.h:39
Type
Definition: IFileSystem.h:103
Definition: DirectoryTemplate.h:36
SEEK_CUR: Current position in file.
bool fileIsEOF(file_t file)
Check if at end of file.
Definition: Core/FileSystem.h:236
virtual int read(FileHandle file, void *data, size_t size)=0
read content from a file and advance cursor
virtual int settime(FileHandle file, time_t mtime)=0
Set modificatino tiem for file.
#define SMING_DEPRECATED
Definition: sming_attr.h:30
virtual int readdir(DirHandle dir, Stat &stat)=0
read a directory entry
#define debug_e(fmt,...)
Definition: debug_progmem.h:77
virtual int ftruncate(FileHandle file, size_t new_size)=0
Truncate (reduce) the size of an open file.
int fileSetContent(const TFileName &fileName, const char *content, size_t length)
Create or replace file with defined content.
Definition: Core/FileSystem.h:283
File()
Definition: Core/FileSystem.h:57
int fileStats(const char *fileName, FileStat &stat)
Get file statistics.
Definition: Core/FileSystem.h:405
Vector< String > fileList()
Get list of files on file system.
bool spiffs_mount()
Mount the first available SPIFFS volume.
IFS::FileSystem * getFileSystem()
Get the currently active file system, if any.
Definition: Core/FileSystem.h:97
IFS::DirHandle DirHandle
Definition: Core/FileSystem.h:27
virtual int flush(FileHandle file)=0
flush any buffered data to physical media
virtual int stat(const char *path, Stat *stat)=0
get file information
File Status structure.
Definition: Stat.h:51
virtual int32_t tell(FileHandle file)=0
get current file position
Manage a set of bit values using enumeration.
Definition: BitSet.h:43
constexpr int FS_OK
Definition: Core/FileSystem.h:34
virtual FileHandle fopen(const Stat &stat, OpenFlags flags)=0
open a file from it&#39;s stat structure
constexpr FileOpenFlags eFO_WriteOnly
Definition: Core/FileSystem.h:76
constexpr FileOpenFlags eFO_ReadOnly
Definition: Core/FileSystem.h:75
int fileOpenRootDir(DirHandle &dir)
Definition: Core/FileSystem.h:484
virtual int format()=0
format the filing system
int fileWrite(file_t file, const void *data, size_t size)
Write to file.
Definition: Core/FileSystem.h:193
Represents a flash partition.
Definition: Partition.h:77
int fileDelete(const char *fileName)
Delete file.
Definition: Core/FileSystem.h:431
int fileReadDir(DirHandle dir, FileStat &stat)
Read a directory entry.
Definition: Core/FileSystem.h:515
void fileSetFileSystem(IFS::IFileSystem *fileSystem)
Sets the currently active file system.
Definition: Access.h:34
virtual int rewinddir(DirHandle dir)=0
Reset directory read position to start.
virtual int fstat(FileHandle file, Stat *stat)=0
get file information
virtual int getinfo(Info &info)=0
get filing system information
virtual int lseek(FileHandle file, int offset, SeekOrigin origin)=0
change file read/write position
static constexpr OpenFlags CreateNewAlways
Definition: File.h:53
constexpr FileOpenFlags eFO_CreateNewAlways
Definition: Core/FileSystem.h:81
constexpr FileOpenFlags eFO_Append
Definition: Core/FileSystem.h:79
void fileFreeFileSystem()
Definition: Core/FileSystem.h:115
IFS::FileHandle FileHandle
Definition: Core/FileSystem.h:26
int fileSystemFormat()
Format the active file system.
Definition: Core/FileSystem.h:548
constexpr SeekOrigin eSO_FileEnd
Definition: Core/FileSystem.h:38
Definition: Core/FileSystem.h:54
virtual int fopendir(const Stat *stat, DirHandle &dir)
open a directory for reading
Definition: IFileSystem.h:203
Directory()
Definition: Core/FileSystem.h:69
constexpr ErrorCode FS_OK
Definition: Error.h:130
constexpr FileOpenFlags eFO_ReadWrite
Definition: Core/FileSystem.h:77
constexpr FileOpenFlags eFO_CreateIfNotExist
Definition: Core/FileSystem.h:78
int fileSetACL(file_t file, const IFS::ACL &acl)
Set access control information.
Definition: Core/FileSystem.h:568
int fileFlush(file_t file)
Flush pending writes.
Definition: Core/FileSystem.h:256
OpenFlag
Definition: OpenFlags.h:41
static constexpr OpenFlags Create
Definition: File.h:50
int fileSystemCheck()
Perform a consistency check/repair on the active file system.
Definition: Core/FileSystem.h:557
static constexpr OpenFlags Truncate
Definition: File.h:52
virtual String getErrorString(int err)
get the text for a returned error code
Definition: IFileSystem.h:184