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.h>
22 
32 using File = IFS::File;
34 constexpr int FS_OK = IFS::FS_OK;
35 
36 namespace SmingInternal
37 {
47 
48 } // namespace SmingInternal
49 
50 /*
51  * Boilerplate check for file function wrappers to catch undefined filesystem.
52  */
53 #define CHECK_FS(_method) \
54  auto fileSystem = static_cast<IFS::FileSystem*>(SmingInternal::activeFileSystem); \
55  if(fileSystem == nullptr) { \
56  debug_e("ERROR in %s(): No active file system", __FUNCTION__); \
57  return FileHandle(IFS::Error::NoFileSystem); \
58  }
59 
65 {
66  if(SmingInternal::activeFileSystem == nullptr) {
67  debug_e("ERROR: No active file system");
68  }
70 }
71 
81 
82 inline void fileFreeFileSystem()
83 {
84  fileSetFileSystem(nullptr);
85 }
86 
91 
96 bool fwfs_mount();
97 
103 
109 inline IFS::FileSystem* fileMountArchive(const String& filename)
110 {
111  auto fs = getFileSystem();
112  return fs ? IFS::mountArchive(*fs, filename) : nullptr;
113 }
114 
120 template <typename T> inline FileHandle fileOpen(const T& path, FileOpenFlags flags = File::ReadOnly)
121 {
122  CHECK_FS(open)
123  return fileSystem->open(path, flags);
124 }
125 
130 inline int fileClose(FileHandle file)
131 {
132  CHECK_FS(close)
133  return fileSystem->close(file);
134 }
135 
142 inline int fileWrite(FileHandle file, const void* data, size_t size)
143 {
144  CHECK_FS(write);
145  return fileSystem->write(file, data, size);
146 }
147 
152 inline int fileTouch(FileHandle file)
153 {
154  return fileWrite(file, nullptr, 0);
155 }
156 
163 inline int fileRead(FileHandle file, void* data, size_t size)
164 {
165  CHECK_FS(read)
166  return fileSystem->read(file, data, size);
167 }
168 
176 {
177  CHECK_FS(seek)
178  return fileSystem->lseek(file, offset, origin);
179 }
180 
185 inline bool fileIsEOF(FileHandle file)
186 {
187  auto fileSystem = getFileSystem();
188  return fileSystem ? (fileSystem->eof(file) != 0) : true;
189 }
190 
196 {
197  CHECK_FS(tell)
198  return fileSystem->tell(file);
199 }
200 
205 inline int fileFlush(FileHandle file)
206 {
207  CHECK_FS(flush)
208  return fileSystem->flush(file);
209 }
210 
215 inline String fileGetErrorString(int err)
216 {
217  auto fileSystem = getFileSystem();
218  if(fileSystem == nullptr) {
219  return IFS::Error::toString(err);
220  }
221  return fileSystem->getErrorString(err);
222 }
223 
232 template <typename TFileName> inline int fileSetContent(const TFileName& fileName, const char* content, size_t length)
233 {
234  CHECK_FS(setContent)
235  return fileSystem->setContent(fileName, content, length);
236 }
237 
238 template <typename TFileName, typename TContent> inline int fileSetContent(const TFileName& fileName, TContent content)
239 {
240  CHECK_FS(setContent)
241  return fileSystem->setContent(fileName, content);
242 }
243 
248 template <typename TFileName> inline file_size_t fileGetSize(const TFileName& fileName)
249 {
250  auto fileSystem = getFileSystem();
251  return fileSystem ? fileSystem->getSize(fileName) : 0;
252 }
253 
261 inline int fileTruncate(FileHandle file, file_size_t newSize)
262 {
263  CHECK_FS(truncate);
264  return fileSystem->ftruncate(file, newSize);
265 }
266 
271 inline int fileTruncate(FileHandle file)
272 {
273  CHECK_FS(truncate);
274  return fileSystem->ftruncate(file);
275 }
276 
284 template <typename TFileName> int fileTruncate(const TFileName& fileName, file_size_t newSize)
285 {
286  CHECK_FS(truncate);
287  return fileSystem->truncate(fileName, newSize);
288 }
289 
295 inline int fileRename(const char* oldName, const char* newName)
296 {
297  CHECK_FS(rename)
298  return fileSystem->rename(oldName, newName);
299 }
300 
301 inline int fileRename(const String& oldName, const String& newName)
302 {
303  return fileRename(oldName.c_str(), newName.c_str());
304 }
305 
313 template <typename TFileName> String fileGetContent(const TFileName& fileName)
314 {
315  auto fileSystem = getFileSystem();
316  return fileSystem ? fileSystem->getContent(fileName) : nullptr;
317 }
318 
330 template <typename TFileName> inline size_t fileGetContent(const TFileName& fileName, char* buffer, size_t bufSize)
331 {
332  auto fileSystem = getFileSystem();
333  return fileSystem ? fileSystem->getContent(fileName, buffer, bufSize) : 0;
334 }
335 
336 template <typename TFileName> inline size_t fileGetContent(const TFileName& fileName, char* buffer)
337 {
338  auto fileSystem = getFileSystem();
339  return fileSystem ? fileSystem->getContent(fileName, buffer) : 0;
340 }
341 
347 inline int fileStats(const char* fileName, FileStat& stat)
348 {
349  CHECK_FS(stat)
350  return fileSystem->stat(fileName, &stat);
351 }
352 
353 inline int fileStats(const String& fileName, FileStat& stat)
354 {
355  return fileStats(fileName.c_str(), stat);
356 }
357 
363 inline int fileStats(FileHandle file, FileStat& stat)
364 {
365  CHECK_FS(fstat)
366  return fileSystem->fstat(file, &stat);
367 }
368 
373 inline int fileDelete(const char* fileName)
374 {
375  CHECK_FS(remove)
376  return fileSystem->remove(fileName);
377 }
378 
379 inline int fileDelete(const String& fileName)
380 {
381  return fileDelete(fileName.c_str());
382 }
383 
388 inline int fileDelete(FileHandle file)
389 {
390  CHECK_FS(fremove)
391  return fileSystem->fremove(file);
392 }
393 
398 inline bool fileExist(const char* fileName)
399 {
400  CHECK_FS(stat)
401  FileStat stat;
402  return fileSystem->stat(fileName, &stat) >= 0 && !stat.attr[FileAttribute::Directory];
403 }
404 
405 inline bool fileExist(const String& fileName)
406 {
407  return fileExist(fileName.c_str());
408 }
409 
414 inline bool dirExist(const char* dirName)
415 {
416  CHECK_FS(stat)
417  FileStat stat;
418  return fileSystem->stat(dirName, &stat) >= 0 && stat.attr[FileAttribute::Directory];
419 }
420 
421 inline bool dirExist(const String& dirName)
422 {
423  return dirExist(dirName.c_str());
424 }
425 
432 inline int fileOpenDir(const char* dirName, DirHandle& dir)
433 {
434  CHECK_FS(opendir)
435  return fileSystem->opendir(dirName, dir);
436 }
437 
438 inline int fileOpenDir(const String& dirName, DirHandle& dir)
439 {
440  return fileOpenDir(dirName.c_str(), dir);
441 }
442 
443 inline int fileOpenRootDir(DirHandle& dir)
444 {
445  return fileOpenDir(nullptr, dir);
446 }
447 
452 inline int fileCloseDir(DirHandle dir)
453 {
454  CHECK_FS(closedir)
455  return fileSystem->closedir(dir);
456 }
457 
463 inline int fileReadDir(DirHandle dir, FileStat& stat)
464 {
465  CHECK_FS(readdir)
466  return fileSystem->readdir(dir, stat);
467 }
468 
473 inline int fileRewindDir(DirHandle dir)
474 {
475  CHECK_FS(rewinddir)
476  return fileSystem->rewinddir(dir);
477 }
478 
483 {
484  CHECK_FS(getinfo)
485  return fileSystem->getinfo(info);
486 }
487 
492 
496 inline int fileSystemFormat()
497 {
498  CHECK_FS(format)
499  return fileSystem->format();
500 }
501 
505 inline int fileSystemCheck()
506 {
507  CHECK_FS(check)
508  return fileSystem->check();
509 }
510 
516 inline int fileSetACL(FileHandle file, const IFS::ACL& acl)
517 {
518  CHECK_FS(setacl)
519  return fileSystem->setacl(file, acl);
520 }
521 
527 template <typename T> int fileSetAttr(const T& filename, FileAttributes attr)
528 {
529  CHECK_FS(setattr)
530  return fileSystem->setattr(filename, attr);
531 }
532 
538 inline int fileSetTime(FileHandle file, time_t mtime)
539 {
540  CHECK_FS(settime)
541  return fileSystem->settime(file, mtime);
542 }
543 
548 template <typename T> int createDirectory(const T& path)
549 {
550  CHECK_FS(mkdir);
551  return fileSystem->mkdir(path);
552 }
553 
558 template <typename T> int createDirectories(const T& path)
559 {
560  CHECK_FS(mkdir);
561  return fileSystem->makedirs(path);
562 }
563 
int32_t file_offset_t
Definition: Components/IFS/src/include/IFS/Types.h:51
uint32_t file_size_t
Definition: Components/IFS/src/include/IFS/Types.h:50
SeekOrigin
Stream/file seek origins.
Definition: SeekOrigin.h:18
Manage a set of bit values using enumeration.
Definition: BitSet.h:45
Wrapper class for enumerating a directory.
Definition: Directory.h:32
Installable File System base class.
Definition: Components/IFS/src/include/IFS/FileSystem.h:40
Wraps up all file access methods.
Definition: File.h:30
static constexpr OpenFlags ReadOnly
Read-only.
Definition: File.h:38
Installable File System base class.
Definition: IFileSystem.h:100
Type
Definition: IFileSystem.h:102
Represents a flash partition.
Definition: Partition.h:86
The String class.
Definition: WString.h:137
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:616
#define debug_e(fmt,...)
Definition: debug_progmem.h:77
int fileTruncate(FileHandle file, file_size_t newSize)
Truncate (reduce) the size of an open file.
Definition: Core/FileSystem.h:261
IFS::Directory Directory
Definition: Core/FileSystem.h:33
bool fwfs_mount()
Mount the first available FWFS volume.
int fileRename(const char *oldName, const char *newName)
Rename file.
Definition: Core/FileSystem.h:295
int fileSetACL(FileHandle file, const IFS::ACL &acl)
Set access control information.
Definition: Core/FileSystem.h:516
FileHandle fileOpen(const T &path, FileOpenFlags flags=File::ReadOnly)
Open file by path.
Definition: Core/FileSystem.h:120
bool fileIsEOF(FileHandle file)
Check if at end of file.
Definition: Core/FileSystem.h:185
int fileSystemCheck()
Perform a consistency check/repair on the active file system.
Definition: Core/FileSystem.h:505
String toString(int err)
get text for an error code
int createDirectory(const T &path)
Create a directory.
Definition: Core/FileSystem.h:548
int fileOpenDir(const char *dirName, DirHandle &dir)
Open a named directory for reading.
Definition: Core/FileSystem.h:432
IFS::FileHandle file_t
Definition: Core/FileSystem.h:23
int fileRead(FileHandle file, void *data, size_t size)
Read from file.
Definition: Core/FileSystem.h:163
IFS::FileSystem::Type fileSystemType()
Get the type of file system currently mounted (if any)
int fileCloseDir(DirHandle dir)
close a directory object
Definition: Core/FileSystem.h:452
IFS::FileSystem * fileMountArchive(const String &filename)
Mount a backup archive.
Definition: Core/FileSystem.h:109
IFS::DirHandle DirHandle
Definition: Core/FileSystem.h:25
void fileSetFileSystem(IFS::IFileSystem *fileSystem)
Sets the currently active file system.
bool fileMountFileSystem(IFS::IFileSystem *fs)
Mount a constructed filesystem with debug messages.
bool dirExist(const char *dirName)
Check if a directory exists on file system.
Definition: Core/FileSystem.h:414
int fileSetAttr(const T &filename, FileAttributes attr)
Set file attributes.
Definition: Core/FileSystem.h:527
int fileSetContent(const TFileName &fileName, const char *content, size_t length)
Create or replace file with defined content.
Definition: Core/FileSystem.h:232
IFS::FileSystem * getFileSystem()
Get the currently active file system, if any.
Definition: Core/FileSystem.h:64
constexpr int FS_OK
Definition: Core/FileSystem.h:34
IFS::File File
Definition: Core/FileSystem.h:32
int fileSystemFormat()
Format the active file system.
Definition: Core/FileSystem.h:496
int fileStats(const char *fileName, FileStat &stat)
Get file statistics.
Definition: Core/FileSystem.h:347
int fileRewindDir(DirHandle dir)
Rewind to start of directory entries.
Definition: Core/FileSystem.h:473
IFS::FileHandle FileHandle
Definition: Core/FileSystem.h:24
int fileFlush(FileHandle file)
Flush pending writes.
Definition: Core/FileSystem.h:205
int fileWrite(FileHandle file, const void *data, size_t size)
Write to file.
Definition: Core/FileSystem.h:142
file_offset_t fileSeek(FileHandle file, file_offset_t offset, SeekOrigin origin)
Position file cursor.
Definition: Core/FileSystem.h:175
#define CHECK_FS(_method)
Definition: Core/FileSystem.h:53
int fileDelete(const char *fileName)
Delete file.
Definition: Core/FileSystem.h:373
constexpr ErrorCode FS_OK
Definition: Components/IFS/src/include/IFS/Error.h:130
file_offset_t fileTell(FileHandle file)
Get position in file.
Definition: Core/FileSystem.h:195
bool fileExist(const char *fileName)
Check if a file exists on file system.
Definition: Core/FileSystem.h:398
int fileTouch(FileHandle file)
Update file modification time.
Definition: Core/FileSystem.h:152
void fileFreeFileSystem()
Definition: Core/FileSystem.h:82
int fileSetTime(FileHandle file, time_t mtime)
Set access control information for file.
Definition: Core/FileSystem.h:538
int fileReadDir(DirHandle dir, FileStat &stat)
Read a directory entry.
Definition: Core/FileSystem.h:463
String fileGetErrorString(int err)
get the text for a returned error code
Definition: Core/FileSystem.h:215
String fileGetContent(const TFileName &fileName)
Read content of a file.
Definition: Core/FileSystem.h:313
int fileGetSystemInfo(IFS::FileSystem::Info &info)
Get basic file system information.
Definition: Core/FileSystem.h:482
int createDirectories(const T &path)
Create a directory and all required parent directories.
Definition: Core/FileSystem.h:558
int fileOpenRootDir(DirHandle &dir)
Definition: Core/FileSystem.h:443
file_size_t fileGetSize(const TFileName &fileName)
Get size of file.
Definition: Core/FileSystem.h:248
int fileClose(FileHandle file)
Clode file.
Definition: Core/FileSystem.h:130
FileSystem * mountArchive(FileSystem &fs, const String &filename)
Mount an FWFS archive.
BitSet< uint8_t, FileAttribute, size_t(FileAttribute::MAX)> FileAttributes
File attributes are stored as a bitmask.
Definition: FileAttributes.h:56
FileAttribute
Definition: FileAttributes.h:46
struct ImplFileDir * DirHandle
Definition: IFileSystem.h:72
OpenFlag
Definition: OpenFlags.h:42
BitSet< uint8_t, OpenFlag, size_t(OpenFlag::MAX)> OpenFlags
Definition: OpenFlags.h:50
int16_t FileHandle
File handle.
Definition: Stat.h:40
Timer2Clock::Ticks< uint32_t > read()
Get elapsed watchdog time since last reset.
Definition: Core/FileSystem.h:37
IFS::FileSystem * activeFileSystem
Global file system instance.
Definition: Access.h:34
Basic information about filing system.
Definition: IFileSystem.h:122
version of Stat with integrated name buffer
Definition: Stat.h:103
File Status structure.
Definition: Stat.h:52
FileAttributes attr
Definition: Stat.h:59