Soldered SD Card Arduino Library 1.0.0
Easily read and write files to and form the SD card breakout! A fork of the original SDFat library by Bill Greiman.
Loading...
Searching...
No Matches
FatFile.h
Go to the documentation of this file.
1
25#ifndef FatFile_h
26#define FatFile_h
31#include "../common/FmtNumber.h"
32#include "../common/FsApiConstants.h"
33#include "../common/FsDateTime.h"
34#include "../common/FsStructs.h"
35#include "FatLibConfig.h"
36#include "FatPartition.h"
37#include <limits.h>
38#include <stddef.h>
39#include <string.h>
40class FatVolume;
41//------------------------------------------------------------------------------
42// Stuff to store strings in AVR flash.
43#ifdef __AVR__
44#include <avr/pgmspace.h>
45#else // __AVR__
46#ifndef PSTR
48#define PSTR(x) (x)
49#endif // PSTR
50#ifndef pgm_read_byte
52#define pgm_read_byte(addr) (*(const unsigned char *)(addr))
53#endif // pgm_read_byte
54#ifndef pgm_read_word
56#define pgm_read_word(addr) (*(const uint16_t *)(addr))
57#endif // pgm_read_word
58#ifndef PROGMEM
60#define PROGMEM
61#endif // PROGMEM
62#endif // __AVR__
63//------------------------------------------------------------------------------
69{
71 uint32_t position;
73 uint32_t cluster;
74};
75//------------------------------------------------------------------------------
77#define isDirSeparator(c) ((c) == '/')
78//------------------------------------------------------------------------------
83struct fname_t
84{
86 uint8_t flags;
88 size_t len;
90 const char *lfn;
92 uint8_t seqPos;
94 uint8_t sfn[11];
95};
97const uint8_t FNAME_FLAG_LOST_CHARS = 0X01;
99const uint8_t FNAME_FLAG_MIXED_CASE = 0X02;
106//==============================================================================
112{
113 public:
116 {
117 }
125 FatFile(const char *path, oflag_t oflag)
126 {
127 open(path, oflag);
128 }
129#if DESTRUCTOR_CLOSES_FILE
132 {
133 if (isOpen())
134 {
135 close();
136 }
137 }
138#endif // DESTRUCTOR_CLOSES_FILE
143 operator bool() const
144 {
145 return isOpen();
146 }
155 int available() const
156 {
157 uint32_t n = available32();
158 return n > INT_MAX ? INT_MAX : n;
159 }
163 uint32_t available32() const
164 {
165 return isFile() ? fileSize() - curPosition() : 0;
166 }
169 {
170 m_error = 0;
171 }
174 {
175 m_error &= ~WRITE_ERROR;
176 }
182 bool close();
192 bool contiguousRange(uint32_t *bgnSector, uint32_t *endSector);
201 bool createContiguous(FatFile *dirFile, const char *path, uint32_t size);
209 bool createContiguous(const char *path, uint32_t size);
211 uint32_t curCluster() const
212 {
213 return m_curCluster;
214 }
215
217 uint32_t curPosition() const
218 {
219 return m_curPosition;
220 }
227 bool dirEntry(DirFat_t *dir);
229 uint16_t dirIndex() const
230 {
231 return m_dirIndex;
232 }
236 uint32_t dirSize();
242 void dmpFile(print_t *pr, uint32_t pos, size_t n);
254 bool exists(const char *path)
255 {
256 FatFile file;
257 return file.open(this, path, O_RDONLY);
258 }
262 void fgetpos(fspos_t *pos) const;
284 int fgets(char *str, int num, char *delim = nullptr);
286 uint32_t fileSize() const
287 {
288 return m_fileSize;
289 }
291 uint32_t firstBlock() const
292 {
293 return firstSector();
294 }
296 uint32_t firstSector() const;
298 void flush()
299 {
300 sync();
301 }
305 void fsetpos(const fspos_t *pos);
312 bool getAccessDate(uint16_t *pdate);
322 bool getAccessDateTime(uint16_t *pdate, uint16_t *ptime)
323 {
324 if (!getAccessDate(pdate))
325 {
326 return false;
327 }
328 *ptime = 0;
329 return true;
330 }
338 bool getCreateDateTime(uint16_t *pdate, uint16_t *ptime);
340 uint8_t getError() const
341 {
342 return m_error;
343 }
351 bool getModifyDateTime(uint16_t *pdate, uint16_t *ptime);
361 size_t getName(char *name, size_t size);
369 size_t getSFN(char *name);
371 bool getWriteError() const
372 {
373 return isOpen() ? m_error & WRITE_ERROR : true;
374 }
380 bool isBusy();
381#if USE_FAT_FILE_FLAG_CONTIGUOUS
383 bool isContiguous() const
384 {
386 }
387#endif // USE_FAT_FILE_FLAG_CONTIGUOUS
389 bool isDir() const
390 {
392 }
394 bool isFile() const
395 {
397 }
399 bool isHidden() const
400 {
402 }
404 bool isLFN() const
405 {
406 return m_lfnOrd;
407 }
409 bool isOpen() const
410 {
411 return m_attributes;
412 }
414 bool isReadable() const
415 {
416 return m_flags & FILE_FLAG_READ;
417 }
419 bool isReadOnly() const
420 {
422 }
424 bool isRoot() const
425 {
427 }
429 bool isRoot32() const
430 {
432 }
434 bool isRootFixed() const
435 {
437 }
439 bool isSubDir() const
440 {
442 }
444 bool isSystem() const
445 {
447 }
449 bool isWritable() const
450 {
451 return m_flags & FILE_FLAG_WRITE;
452 }
457 static bool legal83Char(uint8_t c)
458 {
459 if (c == '"' || c == '|')
460 {
461 return false;
462 }
463 // *+,./
464 if (0X2A <= c && c <= 0X2F && c != 0X2D)
465 {
466 return false;
467 }
468 // :;<=>?
469 if (0X3A <= c && c <= 0X3F)
470 {
471 return false;
472 }
473 // [\]
474 if (0X5B <= c && c <= 0X5D)
475 {
476 return false;
477 }
478 return 0X20 < c && c < 0X7F;
479 }
497 bool ls(print_t *pr, uint8_t flags = 0, uint8_t indent = 0);
509 bool mkdir(FatFile *dir, const char *path, bool pFlag = true);
515 const char *name() const
516 {
517 return "use getName()";
518 }
530 bool open(FatVolume *vol, const char *path, oflag_t oflag);
544 bool open(FatFile *dirFile, uint16_t index, oflag_t oflag);
590 bool open(FatFile *dirFile, const char *path, oflag_t oflag);
600 bool open(const char *path, oflag_t oflag = O_RDONLY);
611 bool openNext(FatFile *dirFile, oflag_t oflag = O_RDONLY);
618 bool openRoot(FatVolume *vol);
623 int peek();
633 bool preAllocate(uint32_t length);
640 size_t printAccessDate(print_t *pr);
648 {
649 return printAccessDate(pr);
650 }
657 size_t printCreateDateTime(print_t *pr);
665 static void printFatDate(print_t *pr, uint16_t fatDate);
673 static void printFatTime(print_t *pr, uint16_t fatTime);
680 size_t printField(double value, char term, uint8_t prec = 2)
681 {
682 char buf[24];
683 char *str = buf + sizeof(buf);
684 if (term)
685 {
686 *--str = term;
687 if (term == '\n')
688 {
689 *--str = '\r';
690 }
691 }
692 str = fmtDouble(str, value, prec, false);
693 return write(str, buf + sizeof(buf) - str);
694 }
701 size_t printField(float value, char term, uint8_t prec = 2)
702 {
703 return printField(static_cast<double>(value), term, prec);
704 }
710 template <typename Type> size_t printField(Type value, char term)
711 {
712 char sign = 0;
713 char buf[3 * sizeof(Type) + 3];
714 char *str = buf + sizeof(buf);
715
716 if (term)
717 {
718 *--str = term;
719 if (term == '\n')
720 {
721 *--str = '\r';
722 }
723 }
724 if (value < 0)
725 {
726 value = -value;
727 sign = '-';
728 }
729 if (sizeof(Type) < 4)
730 {
731 str = fmtBase10(str, (uint16_t)value);
732 }
733 else
734 {
735 str = fmtBase10(str, (uint32_t)value);
736 }
737 if (sign)
738 {
739 *--str = sign;
740 }
741 return write(str, &buf[sizeof(buf)] - str);
742 }
750 size_t printFileSize(print_t *pr);
757 size_t printModifyDateTime(print_t *pr);
764 size_t printName(print_t *pr);
765
773 size_t printSFN(print_t *pr);
779 int read()
780 {
781 uint8_t b;
782 return read(&b, 1) == 1 ? b : -1;
783 }
795 int read(void *buf, size_t count);
806 int8_t readDir(DirFat_t *dir);
817 bool remove();
832 bool remove(const char *path);
841 bool rename(const char *newPath);
849 bool rename(FatFile *dirFile, const char *newPath);
851 void rewind()
852 {
853 seekSet(0);
854 }
867 bool rmdir();
882 bool rmRfStar();
887 bool seekCur(int32_t offset)
888 {
889 return seekSet(m_curPosition + offset);
890 }
896 bool seekEnd(int32_t offset = 0)
897 {
898 return isFile() ? seekSet(m_fileSize + offset) : false;
899 }
906 bool seekSet(uint32_t pos);
912 bool sync();
945 bool timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute,
946 uint8_t second);
947
954 bool truncate();
962 bool truncate(uint32_t length)
963 {
964 return seekSet(length) && truncate();
965 }
971 size_t write(const char *str)
972 {
973 return write(str, strlen(str));
974 }
979 size_t write(uint8_t b)
980 {
981 return write(&b, 1);
982 }
999 size_t write(const void *buf, size_t count);
1000//------------------------------------------------------------------------------
1001#if ENABLE_ARDUINO_SERIAL
1014 bool ls(uint8_t flags = 0)
1015 {
1016 return ls(&Serial, flags);
1017 }
1022 size_t printName()
1023 {
1024 return FatFile::printName(&Serial);
1025 }
1026#endif // ENABLE_ARDUINO_SERIAL
1027
1028 private:
1030 friend class FatVolume;
1031
1033 static const uint8_t FILE_ATTR_CLOSED = 0;
1037 static const uint8_t FILE_ATTR_HIDDEN = FAT_ATTRIB_HIDDEN;
1039 static const uint8_t FILE_ATTR_SYSTEM = FAT_ATTRIB_SYSTEM;
1041 static const uint8_t FILE_ATTR_FILE = 0X08;
1045 static const uint8_t FILE_ATTR_ROOT_FIXED = 0X20;
1047 static const uint8_t FILE_ATTR_ROOT32 = 0X40;
1053 static const uint8_t FILE_ATTR_COPY =
1055
1056 // private functions
1057 bool addCluster();
1058 bool addDirCluster();
1059 DirFat_t *cacheDirEntry(uint8_t action);
1060 static uint8_t lfnChecksum(uint8_t *name);
1061 bool lfnUniqueSfn(fname_t *fname);
1062 bool openCluster(FatFile *file);
1063 static bool parsePathName(const char *str, fname_t *fname, const char **ptr);
1064 bool mkdir(FatFile *parent, fname_t *fname);
1065 bool open(FatFile *dirFile, fname_t *fname, oflag_t oflag);
1066 bool openCachedEntry(FatFile *dirFile, uint16_t cacheIndex, oflag_t oflag, uint8_t lfnOrd);
1067 DirFat_t *readDirCache(bool skipReadOk = false);
1068
1069 // bits defined in m_flags
1070 static const uint8_t FILE_FLAG_READ = 0X01;
1071 static const uint8_t FILE_FLAG_WRITE = 0X02;
1072 static const uint8_t FILE_FLAG_APPEND = 0X08;
1073 // treat curPosition as valid length.
1074 static const uint8_t FILE_FLAG_PREALLOCATE = 0X20;
1075 // file is contiguous
1076 static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40;
1077 // sync of directory entry required
1078 static const uint8_t FILE_FLAG_DIR_DIRTY = 0X80;
1079
1080 // private data
1081 static const uint8_t WRITE_ERROR = 0X1;
1082 static const uint8_t READ_ERROR = 0X2;
1083
1085 uint8_t m_error = 0; // Error bits.
1086 uint8_t m_flags = 0; // See above for definition of m_flags bits
1087 uint8_t m_lfnOrd;
1088 uint16_t m_dirIndex; // index of directory entry in dir file
1089 FatVolume *m_vol; // volume where file is located
1091 uint32_t m_curCluster; // cluster for current file position
1092 uint32_t m_curPosition; // current file position
1093 uint32_t m_dirSector; // sector for this files directory entry
1094 uint32_t m_fileSize; // file size in bytes
1095 uint32_t m_firstCluster; // first cluster of file
1096};
1097
1098#include "../common/ArduinoFiles.h"
1103class File32 : public StreamFile<FatFile, uint32_t>
1104{
1105 public:
1111 File32 openNextFile(oflag_t oflag = O_RDONLY)
1112 {
1113 File32 tmpFile;
1114 tmpFile.openNext(this, oflag);
1115 return tmpFile;
1116 }
1117};
1118#endif // FatFile_h
const uint8_t FNAME_FLAG_LC_EXT
Definition FatFile.h:105
const uint8_t FNAME_FLAG_NEED_LFN
Definition FatFile.h:101
const uint8_t FNAME_FLAG_MIXED_CASE
Definition FatFile.h:99
const uint8_t FNAME_FLAG_LC_BASE
Definition FatFile.h:103
const uint8_t FNAME_FLAG_LOST_CHARS
Definition FatFile.h:97
configuration definitions
FatPartition class.
char * fmtDouble(char *str, double num, uint8_t prec, bool altFmt)
Definition FmtNumber.cpp:262
char * fmtBase10(char *str, uint16_t n)
Definition FmtNumber.cpp:163
int oflag_t
Definition FsApiConstants.h:45
const uint8_t FAT_ATTRIB_READ_ONLY
Definition FsStructs.h:224
const uint8_t FAT_ATTRIB_SYSTEM
Definition FsStructs.h:226
const uint8_t FAT_CASE_LC_BASE
Definition FsStructs.h:232
const uint8_t FAT_CASE_LC_EXT
Definition FsStructs.h:234
const uint8_t FAT_ATTRIB_HIDDEN
Definition FsStructs.h:225
const uint8_t FAT_ATTRIB_DIRECTORY
Definition FsStructs.h:228
Print print_t
Definition SysCall.h:66
Basic file class.
Definition FatFile.h:112
size_t getName(char *name, size_t size)
Definition FatFileLFN.cpp:148
bool isRoot() const
Definition FatFile.h:424
void clearError()
Definition FatFile.h:168
DirFat_t * readDirCache(bool skipReadOk=false)
Definition FatFile.cpp:1028
size_t write(const char *str)
Definition FatFile.h:971
bool createContiguous(FatFile *dirFile, const char *path, uint32_t size)
Definition FatFile.cpp:193
bool isRootFixed() const
Definition FatFile.h:434
size_t printFileSize(print_t *pr)
Definition FatFilePrint.cpp:176
bool contiguousRange(uint32_t *bgnSector, uint32_t *endSector)
Definition FatFile.cpp:132
bool isContiguous() const
Definition FatFile.h:383
void flush()
Definition FatFile.h:298
uint8_t m_flags
Definition FatFile.h:1086
static const uint8_t FILE_FLAG_DIR_DIRTY
Definition FatFile.h:1078
size_t printAccessDateTime(print_t *pr)
Definition FatFile.h:647
DirFat_t * cacheDirEntry(uint8_t action)
Definition FatFile.cpp:109
static const uint8_t FILE_ATTR_DIR
Definition FatFile.h:1051
size_t printAccessDate(print_t *pr)
Definition FatFilePrint.cpp:144
static const uint8_t FILE_FLAG_CONTIGUOUS
Definition FatFile.h:1076
bool getModifyDateTime(uint16_t *pdate, uint16_t *ptime)
Definition FatFile.cpp:343
bool lfnUniqueSfn(fname_t *fname)
Definition FatFileLFN.cpp:789
int8_t readDir(DirFat_t *dir)
Definition FatFile.cpp:992
bool dirEntry(DirFat_t *dir)
Definition FatFile.cpp:209
FatFile(const char *path, oflag_t oflag)
Definition FatFile.h:125
uint32_t m_firstCluster
Definition FatFile.h:1095
static const uint8_t FILE_ATTR_ROOT_FIXED
Definition FatFile.h:1045
size_t printModifyDateTime(print_t *pr)
Definition FatFilePrint.cpp:165
static const uint8_t FILE_FLAG_WRITE
Definition FatFile.h:1071
bool isSystem() const
Definition FatFile.h:444
~FatFile()
Definition FatFile.h:131
uint8_t m_attributes
Definition FatFile.h:1084
bool rename(const char *newPath)
Definition FatFile.cpp:1070
void dmpFile(print_t *pr, uint32_t pos, size_t n)
Definition FatFilePrint.cpp:44
bool exists(const char *path)
Definition FatFile.h:254
uint32_t curCluster() const
Definition FatFile.h:211
uint32_t m_fileSize
Definition FatFile.h:1094
bool timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
Definition FatFile.cpp:1470
bool seekCur(int32_t offset)
Definition FatFile.h:887
void rewind()
Definition FatFile.h:851
uint32_t firstBlock() const
Definition FatFile.h:291
bool getAccessDate(uint16_t *pdate)
Definition FatFile.cpp:312
bool openCluster(FatFile *file)
Definition FatFileLFN.cpp:209
uint8_t m_lfnOrd
Definition FatFile.h:1087
bool ls(print_t *pr, uint8_t flags=0, uint8_t indent=0)
Definition FatFilePrint.cpp:91
int read()
Definition FatFile.h:779
static uint8_t lfnChecksum(uint8_t *name)
Definition FatFileLFN.cpp:31
bool sync()
Definition FatFile.cpp:1421
int fgets(char *str, int num, char *delim=nullptr)
Definition FatFile.cpp:258
bool ls(uint8_t flags=0)
Definition FatFile.h:1014
static const uint8_t WRITE_ERROR
Definition FatFile.h:1081
static const uint8_t FILE_ATTR_FILE
Definition FatFile.h:1041
static bool parsePathName(const char *str, fname_t *fname, const char **ptr)
Definition FatFileLFN.cpp:223
uint32_t m_dirSector
Definition FatFile.h:1093
size_t printSFN(print_t *pr)
Definition FatFileSFN.cpp:83
int available() const
Definition FatFile.h:155
FatFile()
Definition FatFile.h:115
bool truncate()
Definition FatFile.cpp:1519
bool openRoot(FatVolume *vol)
Definition FatFile.cpp:776
static const uint8_t FILE_ATTR_HIDDEN
Definition FatFile.h:1037
uint16_t dirIndex() const
Definition FatFile.h:229
static void printFatTime(print_t *pr, uint16_t fatTime)
bool isBusy()
Definition FatFile.cpp:359
bool seekEnd(int32_t offset=0)
Definition FatFile.h:896
static const uint8_t FILE_ATTR_SYSTEM
Definition FatFile.h:1039
void fgetpos(fspos_t *pos) const
Definition FatFile.cpp:295
static const uint8_t READ_ERROR
Definition FatFile.h:1082
uint32_t fileSize() const
Definition FatFile.h:286
uint32_t m_curPosition
Definition FatFile.h:1092
uint8_t m_error
Definition FatFile.h:1085
bool isOpen() const
Definition FatFile.h:409
static const uint8_t FILE_ATTR_ROOT
Definition FatFile.h:1049
size_t printField(Type value, char term)
Definition FatFile.h:710
bool isRoot32() const
Definition FatFile.h:429
size_t printField(float value, char term, uint8_t prec=2)
Definition FatFile.h:701
bool getCreateDateTime(uint16_t *pdate, uint16_t *ptime)
Definition FatFile.cpp:327
static bool legal83Char(uint8_t c)
Definition FatFile.h:457
bool rmdir()
Definition FatFile.cpp:1198
uint32_t curPosition() const
Definition FatFile.h:217
uint32_t m_curCluster
Definition FatFile.h:1091
static const uint8_t FILE_FLAG_READ
Definition FatFile.h:1070
static const uint8_t FILE_FLAG_APPEND
Definition FatFile.h:1072
bool isWritable() const
Definition FatFile.h:449
size_t printField(double value, char term, uint8_t prec=2)
Definition FatFile.h:680
bool addDirCluster()
Definition FatFile.cpp:61
bool truncate(uint32_t length)
Definition FatFile.h:962
static void printFatDate(print_t *pr, uint16_t fatDate)
bool seekSet(uint32_t pos)
Definition FatFile.cpp:1341
size_t printCreateDateTime(print_t *pr)
Definition FatFilePrint.cpp:154
uint32_t m_dirCluster
Definition FatFile.h:1090
size_t getSFN(char *name)
Definition FatFileSFN.cpp:31
bool mkdir(FatFile *dir, const char *path, bool pFlag=true)
Definition FatFile.cpp:364
bool isReadOnly() const
Definition FatFile.h:419
static const uint8_t FILE_ATTR_ROOT32
Definition FatFile.h:1047
bool isSubDir() const
Definition FatFile.h:439
static const uint8_t FILE_ATTR_SUBDIR
Definition FatFile.h:1043
void fsetpos(const fspos_t *pos)
Definition FatFile.cpp:306
int peek()
Definition FatFile.cpp:842
uint32_t available32() const
Definition FatFile.h:163
bool getWriteError() const
Definition FatFile.h:371
bool rmRfStar()
Definition FatFile.cpp:1248
bool remove()
Definition FatFileLFN.cpp:699
static const uint8_t FILE_ATTR_COPY
Definition FatFile.h:1053
bool isFile() const
Definition FatFile.h:394
static const uint8_t FILE_ATTR_READ_ONLY
Definition FatFile.h:1035
bool openNext(FatFile *dirFile, oflag_t oflag=O_RDONLY)
Definition FatFile.cpp:707
uint16_t m_dirIndex
Definition FatFile.h:1088
static const uint8_t FILE_FLAG_PREALLOCATE
Definition FatFile.h:1074
const char * name() const
Definition FatFile.h:515
size_t printName()
Definition FatFile.h:1022
FatVolume * m_vol
Definition FatFile.h:1089
bool openCachedEntry(FatFile *dirFile, uint16_t cacheIndex, oflag_t oflag, uint8_t lfnOrd)
Definition FatFile.cpp:615
static const uint8_t FILE_ATTR_CLOSED
Definition FatFile.h:1033
bool isHidden() const
Definition FatFile.h:399
uint32_t dirSize()
Definition FatFile.cpp:233
size_t write(uint8_t b)
Definition FatFile.h:979
bool isReadable() const
Definition FatFile.h:414
void clearWriteError()
Definition FatFile.h:173
bool preAllocate(uint32_t length)
Definition FatFile.cpp:812
uint32_t firstSector() const
Definition FatFile.cpp:301
bool open(FatVolume *vol, const char *path, oflag_t oflag)
Definition FatFile.cpp:499
bool getAccessDateTime(uint16_t *pdate, uint16_t *ptime)
Definition FatFile.h:322
uint8_t getError() const
Definition FatFile.h:340
bool isLFN() const
Definition FatFile.h:404
bool addCluster()
Definition FatFile.cpp:31
bool close()
Definition FatFile.cpp:124
Integration class for the FatLib library.
Definition FatVolume.h:39
FAT16/FAT32 file with Arduino Stream.
Definition FatFile.h:1104
File32 openNextFile(oflag_t oflag=O_RDONLY)
Definition FatFile.h:1111
StreamFile class.
Definition ArduinoFiles.h:64
static bool value
Definition DigitalPin.h:210
Definition FsStructs.h:237
Internal type for file position - do not use in user apps.
Definition FatFile.h:69
uint32_t cluster
Definition FatFile.h:73
uint32_t position
Definition FatFile.h:71
Internal type for Short File Name - do not use in user apps.
Definition FatFile.h:84
uint8_t sfn[11]
Definition FatFile.h:94
uint8_t flags
Definition FatFile.h:86
size_t len
Definition FatFile.h:88
const char * lfn
Definition FatFile.h:90
uint8_t seqPos
Definition FatFile.h:92
Definition FsStructs.h:133