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
ExFatFile.h
Go to the documentation of this file.
1
25#ifndef ExFatFile_h
26#define ExFatFile_h
31#include "../common/FmtNumber.h"
32#include "../common/FsApiConstants.h"
33#include "../common/FsDateTime.h"
34#include "../common/FsStructs.h"
35#include "ExFatConfig.h"
36#include "ExFatPartition.h"
37#include "ExFatTypes.h"
38#include <limits.h>
39#include <string.h>
40
41class ExFatVolume;
42
43//------------------------------------------------------------------------------
45#define isDirSeparator(c) ((c) == '/')
46//------------------------------------------------------------------------------
53inline bool lfnLegalChar(ExChar_t c)
54{
55 if (c == '/' || c == '\\' || c == '"' || c == '*' || c == ':' || c == '<' || c == '>' || c == '?' || c == '|')
56 {
57 return false;
58 }
59#if USE_EXFAT_UNICODE_NAMES
60 return 0X1F < c;
61#else // USE_EXFAT_UNICODE_NAMES
62 return 0X1F < c && c < 0X7F;
63#endif // USE_EXFAT_UNICODE_NAMES
64}
65//------------------------------------------------------------------------------
71{
73 size_t len;
75 const ExChar_t *lfn;
76};
77//------------------------------------------------------------------------------
83{
85 uint64_t position;
87 uint32_t cluster;
88};
89//------------------------------------------------------------------------------
95{
96 public:
99 {
100 }
108 ExFatFile(const char *path, oflag_t oflag)
109 {
110 open(path, oflag);
111 }
112
113#if DESTRUCTOR_CLOSES_FILE
115 {
116 if (isOpen())
117 {
118 close();
119 }
120 }
121#endif // DESTRUCTOR_CLOSES_FILE
122
127 operator bool()
128 {
129 return isOpen();
130 }
140 {
141 uint64_t n = available64();
142 return n > INT_MAX ? INT_MAX : n;
143 }
147 uint64_t available64()
148 {
149 return isFile() ? fileSize() - curPosition() : 0;
150 }
153 {
154 m_error = 0;
155 }
158 {
159 m_error &= ~WRITE_ERROR;
160 }
166 bool close();
176 bool contiguousRange(uint32_t *bgnSector, uint32_t *endSector);
178 uint64_t curPosition() const
179 {
180 return m_curPosition;
181 }
182
184 uint64_t dataLength() const
185 {
186 return m_dataLength;
187 }
189 uint32_t dirIndex() const
190 {
191 return m_dirPos.position / 32;
192 }
204 bool exists(const ExChar_t *path)
205 {
206 ExFatFile file;
207 return file.open(this, path, O_RDONLY);
208 }
212 void fgetpos(fspos_t *pos) const;
234 int fgets(char *str, int num, char *delim = nullptr);
236 uint64_t fileSize() const
237 {
238 return m_validLength;
239 }
241 uint32_t firstSector() const;
245 void fsetpos(const fspos_t *pos);
247 void flush()
248 {
249 sync();
250 }
258 bool getAccessDateTime(uint16_t *pdate, uint16_t *ptime);
266 bool getCreateDateTime(uint16_t *pdate, uint16_t *ptime);
268 uint8_t getError() const
269 {
270 return isOpen() ? m_error : 0XFF;
271 }
279 bool getModifyDateTime(uint16_t *pdate, uint16_t *ptime);
287 size_t getName(ExChar_t *name, size_t size);
289 bool getWriteError() const
290 {
291 return isOpen() ? m_error & WRITE_ERROR : true;
292 }
298 bool isBusy();
300 bool isContiguous() const
301 {
303 }
305 bool isDir() const
306 {
308 }
310 bool isFile() const
311 {
313 }
315 bool isHidden() const
316 {
318 }
320 bool isOpen() const
321 {
322 return m_attributes;
323 }
325 bool isReadOnly() const
326 {
328 }
330 bool isRoot() const
331 {
333 }
335 bool isReadable() const
336 {
337 return m_flags & FILE_FLAG_READ;
338 }
340 bool isSubDir() const
341 {
343 }
345 bool isWritable() const
346 {
347 return m_flags & FILE_FLAG_WRITE;
348 }
354 bool ls(print_t *pr);
372 bool ls(print_t *pr, uint8_t flags, uint8_t indent = 0);
384 bool mkdir(ExFatFile *parent, const ExChar_t *path, bool pFlag = true);
429 bool open(ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag);
441 bool open(ExFatVolume *vol, const ExChar_t *path, int oflag);
455 bool open(ExFatFile *dirFile, uint32_t index, oflag_t oflag);
465 bool open(const ExChar_t *path, int oflag = O_RDONLY);
476 bool openNext(ExFatFile *dirFile, oflag_t oflag = O_RDONLY);
483 bool openRoot(ExFatVolume *vol);
488 int peek();
499 bool preAllocate(uint64_t length);
506 size_t printAccessDateTime(print_t *pr);
513 size_t printCreateDateTime(print_t *pr);
520 size_t printField(double value, char term, uint8_t prec = 2)
521 {
522 char buf[24];
523 char *str = buf + sizeof(buf);
524 if (term)
525 {
526 *--str = term;
527 if (term == '\n')
528 {
529 *--str = '\r';
530 }
531 }
532 str = fmtDouble(str, value, prec, false);
533 return write(str, buf + sizeof(buf) - str);
534 }
541 size_t printField(float value, char term, uint8_t prec = 2)
542 {
543 return printField(static_cast<double>(value), term, prec);
544 }
550 template <typename Type> size_t printField(Type value, char term)
551 {
552 char sign = 0;
553 char buf[3 * sizeof(Type) + 3];
554 char *str = buf + sizeof(buf);
555
556 if (term)
557 {
558 *--str = term;
559 if (term == '\n')
560 {
561 *--str = '\r';
562 }
563 }
564 if (value < 0)
565 {
566 value = -value;
567 sign = '-';
568 }
569 if (sizeof(Type) < 4)
570 {
571 str = fmtBase10(str, (uint16_t)value);
572 }
573 else
574 {
575 str = fmtBase10(str, (uint32_t)value);
576 }
577 if (sign)
578 {
579 *--str = sign;
580 }
581 return write(str, &buf[sizeof(buf)] - str);
582 }
587 size_t printFileSize(print_t *pr);
594 size_t printModifyDateTime(print_t *pr);
601 size_t printName(print_t *pr);
607 int read()
608 {
609 uint8_t b;
610 return read(&b, 1) == 1 ? b : -1;
611 }
623 int read(void *buf, size_t count);
634 bool remove();
649 bool remove(const ExChar_t *path);
656 bool rename(const ExChar_t *newPath);
664 bool rename(ExFatFile *dirFile, const ExChar_t *newPath);
666 void rewind()
667 {
668 seekSet(0);
669 }
682 bool rmdir();
687 bool seekCur(int64_t offset)
688 {
689 return seekSet(m_curPosition + offset);
690 }
696 bool seekEnd(int64_t offset = 0)
697 {
698 return isFile() ? seekSet(m_validLength + offset) : false;
699 }
706 bool seekSet(uint64_t pos);
712 bool sync();
749 bool timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute,
750 uint8_t second);
757 bool truncate();
765 bool truncate(uint64_t length)
766 {
767 return seekSet(length) && truncate();
768 }
769
771 uint64_t validLength() const
772 {
773 return m_validLength;
774 }
780 size_t write(const char *str)
781 {
782 return write(str, strlen(str));
783 }
788 size_t write(uint8_t b)
789 {
790 return write(&b, 1);
791 }
804 size_t write(const void *buf, size_t count);
805 //============================================================================
806#if USE_EXFAT_UNICODE_NAMES
807 // Not Implemented when Unicode is selected.
808 bool exists(const char *path);
809 size_t getName(char *name, size_t size);
810 bool mkdir(ExFatFile *parent, const char *path, bool pFlag = true);
811 bool open(ExFatVolume *vol, const char *path, int oflag);
812 bool open(ExFatFile *dir, const char *path, int oflag);
813 bool open(const char *path, int oflag = O_RDONLY);
814 bool remove(const char *path);
815 bool rename(const char *newPath);
816 bool rename(ExFatFile *dirFile, const char *newPath);
817#endif // USE_EXFAT_UNICODE_NAMES
818
819 private:
821 friend class ExFatVolume;
822 bool addCluster();
823 bool addDirCluster();
824 uint8_t setCount() const
825 {
826 return m_setCount;
827 }
828 bool mkdir(ExFatFile *parent, ExName_t *fname);
829 bool openRootFile(ExFatFile *dir, const ExChar_t *name, uint8_t nameLength, oflag_t oflag);
830 bool open(ExFatFile *dirFile, ExName_t *fname, oflag_t oflag)
831 {
832 return openRootFile(dirFile, fname->lfn, fname->len, oflag);
833 }
834 bool parsePathName(const ExChar_t *path, ExName_t *fname, const ExChar_t **ptr);
835 uint32_t curCluster() const
836 {
837 return m_curCluster;
838 }
840 {
841 return m_vol;
842 }
843 bool syncDir();
844 //----------------------------------------------------------------------------
845 static const uint8_t WRITE_ERROR = 0X1;
846 static const uint8_t READ_ERROR = 0X2;
847
849 static const uint8_t FILE_ATTR_CLOSED = 0;
853 static const uint8_t FILE_ATTR_HIDDEN = EXFAT_ATTRIB_HIDDEN;
855 static const uint8_t FILE_ATTR_SYSTEM = EXFAT_ATTRIB_SYSTEM;
857 static const uint8_t FILE_ATTR_FILE = 0X08;
862 static const uint8_t FILE_ATTR_ROOT = 0X40;
868
869 static const uint8_t FILE_FLAG_READ = 0X01;
870 static const uint8_t FILE_FLAG_WRITE = 0X02;
871 static const uint8_t FILE_FLAG_APPEND = 0X08;
872 static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40;
873 static const uint8_t FILE_FLAG_DIR_DIRTY = 0X80;
874
875
877 uint64_t m_dataLength;
879 uint32_t m_curCluster;
883 uint8_t m_setCount;
885 uint8_t m_error = 0;
886 uint8_t m_flags = 0;
887};
888
889#include "../common/ArduinoFiles.h"
894class ExFile : public StreamFile<ExFatFile, uint64_t>
895{
896 public:
902 ExFile openNextFile(oflag_t oflag = O_RDONLY)
903 {
904 ExFile tmpFile;
905 tmpFile.openNext(this, oflag);
906 return tmpFile;
907 }
908};
909#endif // ExFatFile_h
bool lfnLegalChar(ExChar_t c)
Definition ExFatFile.h:53
ExFatPartition include file.
ExChar16_t ExChar_t
Definition ExFatTypes.h:39
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 EXFAT_ATTRIB_DIRECTORY
Definition FsStructs.h:360
const uint8_t EXFAT_ATTRIB_READ_ONLY
Definition FsStructs.h:356
const uint8_t EXFAT_ATTRIB_ARCHIVE
Definition FsStructs.h:361
const uint8_t EXFAT_ATTRIB_HIDDEN
Definition FsStructs.h:357
const uint8_t EXFAT_ATTRIB_SYSTEM
Definition FsStructs.h:358
Print print_t
Definition SysCall.h:66
Basic file class.
Definition ExFatFile.h:95
bool rmdir()
Definition ExFatFileWrite.cpp:411
static const uint8_t FILE_ATTR_COPY
Definition ExFatFile.h:866
static const uint8_t FILE_ATTR_READ_ONLY
Definition ExFatFile.h:851
bool isWritable() const
Definition ExFatFile.h:345
size_t printName(print_t *pr)
Definition ExFatFilePrint.cpp:171
bool getWriteError() const
Definition ExFatFile.h:289
bool isBusy()
Definition ExFatFile.cpp:200
bool getAccessDateTime(uint16_t *pdate, uint16_t *ptime)
Definition ExFatFile.cpp:110
bool rename(const char *newPath)
static const uint8_t FILE_FLAG_WRITE
Definition ExFatFile.h:870
bool remove(const char *path)
bool isReadOnly() const
Definition ExFatFile.h:325
bool open(ExFatFile *dirFile, ExName_t *fname, oflag_t oflag)
Definition ExFatFile.h:830
size_t printModifyDateTime(print_t *pr)
Definition ExFatFilePrint.cpp:160
size_t printFileSize(print_t *pr)
Definition ExFatFilePrint.cpp:140
static const uint8_t FILE_FLAG_CONTIGUOUS
Definition ExFatFile.h:872
int available()
Definition ExFatFile.h:139
size_t getName(char *name, size_t size)
bool exists(const ExChar_t *path)
Definition ExFatFile.h:204
uint8_t getError() const
Definition ExFatFile.h:268
bool seekEnd(int64_t offset=0)
Definition ExFatFile.h:696
uint32_t curCluster() const
Definition ExFatFile.h:835
bool sync()
Definition ExFatFileWrite.cpp:55
bool exists(const char *path)
uint8_t m_flags
Definition ExFatFile.h:886
bool preAllocate(uint64_t length)
Definition ExFatFileWrite.cpp:39
int fgets(char *str, int num, char *delim=nullptr)
Definition ExFatFile.cpp:62
uint8_t m_attributes
Definition ExFatFile.h:884
bool mkdir(ExFatFile *parent, const ExChar_t *path, bool pFlag=true)
Definition ExFatFileWrite.cpp:32
ExFatFile()
Definition ExFatFile.h:98
void rewind()
Definition ExFatFile.h:666
bool openNext(ExFatFile *dirFile, oflag_t oflag=O_RDONLY)
Definition ExFatFile.cpp:282
static const uint8_t FILE_ATTR_FILE
Definition ExFatFile.h:857
size_t printField(double value, char term, uint8_t prec=2)
Definition ExFatFile.h:520
ExFatVolume * m_vol
Definition ExFatFile.h:881
static const uint8_t FILE_ATTR_ARCHIVE
Definition ExFatFile.h:860
static const uint8_t FILE_ATTR_SUBDIR
Definition ExFatFile.h:859
bool truncate(uint64_t length)
Definition ExFatFile.h:765
static const uint8_t FILE_ATTR_HIDDEN
Definition ExFatFile.h:853
void fgetpos(fspos_t *pos) const
Definition ExFatFile.cpp:56
bool timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
Definition ExFatFileWrite.cpp:564
uint8_t m_setCount
Definition ExFatFile.h:883
size_t write(const char *str)
Definition ExFatFile.h:780
bool getCreateDateTime(uint16_t *pdate, uint16_t *ptime)
Definition ExFatFile.cpp:126
bool rename(ExFatFile *dirFile, const char *newPath)
size_t printField(float value, char term, uint8_t prec=2)
Definition ExFatFile.h:541
size_t printCreateDateTime(print_t *pr)
Definition ExFatFilePrint.cpp:129
static const uint8_t FILE_FLAG_READ
Definition ExFatFile.h:869
static const uint8_t FILE_FLAG_APPEND
Definition ExFatFile.h:871
bool parsePathName(const ExChar_t *path, ExName_t *fname, const ExChar_t **ptr)
Definition ExFatFile.cpp:629
int read()
Definition ExFatFile.h:607
bool isContiguous() const
Definition ExFatFile.h:300
bool close()
Definition ExFatFile.cpp:31
bool isOpen() const
Definition ExFatFile.h:320
static const uint8_t FILE_ATTR_SYSTEM
Definition ExFatFile.h:855
uint64_t m_dataLength
Definition ExFatFile.h:877
bool remove()
Definition ExFatFileWrite.cpp:307
uint64_t fileSize() const
Definition ExFatFile.h:236
size_t printField(Type value, char term)
Definition ExFatFile.h:550
static const uint8_t FILE_ATTR_ROOT
Definition ExFatFile.h:862
bool seekSet(uint64_t pos)
Definition ExFatFile.cpp:817
bool syncDir()
Definition ExFatFileWrite.cpp:474
uint64_t validLength() const
Definition ExFatFile.h:771
bool isReadable() const
Definition ExFatFile.h:335
bool ls(print_t *pr)
Definition ExFatFilePrint.cpp:31
bool open(ExFatVolume *vol, const char *path, int oflag)
bool rename(const ExChar_t *newPath)
Definition ExFatFileWrite.cpp:44
void flush()
Definition ExFatFile.h:247
ExFatFile(const char *path, oflag_t oflag)
Definition ExFatFile.h:108
bool seekCur(int64_t offset)
Definition ExFatFile.h:687
uint64_t curPosition() const
Definition ExFatFile.h:178
uint32_t m_curCluster
Definition ExFatFile.h:879
size_t getName(ExChar_t *name, size_t size)
Definition ExFatFile.cpp:158
void clearWriteError()
Definition ExFatFile.h:157
uint64_t dataLength() const
Definition ExFatFile.h:184
bool addCluster()
Definition ExFatFileWrite.cpp:82
static const uint8_t WRITE_ERROR
Definition ExFatFile.h:845
bool addDirCluster()
Definition ExFatFileWrite.cpp:142
bool getModifyDateTime(uint16_t *pdate, uint16_t *ptime)
Definition ExFatFile.cpp:142
void clearError()
Definition ExFatFile.h:152
uint64_t m_validLength
Definition ExFatFile.h:878
uint8_t m_error
Definition ExFatFile.h:885
static const uint8_t FILE_ATTR_DIR
Definition ExFatFile.h:864
bool isHidden() const
Definition ExFatFile.h:315
uint8_t setCount() const
Definition ExFatFile.h:824
bool truncate()
Definition ExFatFileWrite.cpp:59
uint32_t m_firstCluster
Definition ExFatFile.h:880
bool isDir() const
Definition ExFatFile.h:305
bool open(ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag)
Definition ExFatFile.cpp:215
bool isSubDir() const
Definition ExFatFile.h:340
size_t printAccessDateTime(print_t *pr)
Definition ExFatFilePrint.cpp:118
bool mkdir(ExFatFile *parent, const char *path, bool pFlag=true)
bool isRoot() const
Definition ExFatFile.h:330
DirPos_t m_dirPos
Definition ExFatFile.h:882
static const uint8_t FILE_FLAG_DIR_DIRTY
Definition ExFatFile.h:873
uint64_t available64()
Definition ExFatFile.h:147
bool contiguousRange(uint32_t *bgnSector, uint32_t *endSector)
Definition ExFatFile.cpp:39
uint32_t firstSector() const
Definition ExFatFile.cpp:99
bool openRootFile(ExFatFile *dir, const ExChar_t *name, uint8_t nameLength, oflag_t oflag)
Definition ExFatFile.cpp:295
void fsetpos(const fspos_t *pos)
Definition ExFatFile.cpp:104
uint32_t dirIndex() const
Definition ExFatFile.h:189
ExFatVolume * volume() const
Definition ExFatFile.h:839
static const uint8_t READ_ERROR
Definition ExFatFile.h:846
bool open(const char *path, int oflag=O_RDONLY)
static const uint8_t FILE_ATTR_CLOSED
Definition ExFatFile.h:849
bool open(ExFatFile *dir, const char *path, int oflag)
bool isFile() const
Definition ExFatFile.h:310
bool openRoot(ExFatVolume *vol)
Definition ExFatFile.cpp:612
uint64_t m_curPosition
Definition ExFatFile.h:876
int peek()
Definition ExFatFile.cpp:679
size_t write(uint8_t b)
Definition ExFatFile.h:788
~ExFatFile()
Definition ExFatFile.h:114
exFAT volume.
Definition ExFatVolume.h:35
exFAT file with Arduino Stream.
Definition ExFatFile.h:895
ExFile openNextFile(oflag_t oflag=O_RDONLY)
Definition ExFatFile.h:902
StreamFile class.
Definition ArduinoFiles.h:64
static bool value
Definition DigitalPin.h:210
Internal type for position in directory file.
Definition ExFatTypes.h:49
uint32_t position
Definition ExFatTypes.h:53
Internal type for file position - do not use in user apps.
Definition ExFatFile.h:83
uint64_t position
Definition ExFatFile.h:85
uint32_t cluster
Definition ExFatFile.h:87
Internal type for file name - do not use in user apps.
Definition ExFatFile.h:71
size_t len
Definition ExFatFile.h:73
const ExChar_t * lfn
Definition ExFatFile.h:75
Definition FsStructs.h:133