78class File :
public Stream {
81 if (filename ==
"")
return false;
82 if (is_dir)
return true;
83 bool result = file.is_open();
87 bool open(
const char *name,
int flags) {
88 this->filename = name;
89 int rc = stat(name, &info);
90 if ((flags == O_RDONLY) && rc == -1) {
93 }
else if (rc == 0 && info.st_mode & S_IFDIR) {
100 dir_path = std::filesystem::path(filename);
101 iterator = std::filesystem::directory_iterator({dir_path});
108 size_bytes = rc != -1 ? info.st_size : 0;
109 file.open(filename.c_str(), toMode(flags));
119 size_t read(uint8_t *buffer,
size_t length) {
120 return readBytes((
char *)buffer, length);
123 size_t readBytes(
char *buffer,
size_t length) {
124 file.read(buffer, length);
125 return static_cast<size_t>(file.gcount());
128 size_t write(
const uint8_t *buffer,
size_t size)
override {
129 file.write((
const char *)buffer, size);
130 return file.good() ? size : 0;
132 size_t write(uint8_t ch)
override {
134 return file.good() ? 1 : 0;
136 int available()
override {
return size_bytes - file.tellg(); };
137 int availableForWrite()
override {
return 1024; }
138 int read()
override {
return file.get(); }
139 int peek()
override {
return file.peek(); }
140 void flush()
override {}
141 void getName(
char *str,
size_t len) { strncpy(str, filename.c_str(), len); }
142 bool isDir() {
return is_dir; }
143 bool isHidden() {
return false; }
148 bool openNext(
File &dir,
int flags = O_RDONLY) {
149 if (!*
this)
return false;
157 if (iterator != end(iterator)) {
158 std::filesystem::directory_entry entry = *iterator++;
159 return dir.open(entry.path().c_str(), flags);
164 int dirIndex() {
return pos; }
166 File openNextFile() {
168 openNext(next_file, O_RDONLY);
173 int rc = stat(filename.c_str(), &info);
174 size_bytes = rc != -1 ? info.st_size : 0;
178 size_t position() {
return file.tellg(); }
180 bool seek(
size_t pos) {
182 return file ? true :
false;
185 operator bool() {
return isOpen(); }
187 bool isDirectory() {
return is_dir; }
189 const char *name() {
return filename.c_str(); }
191 void rewindDirectory() {
195 iterator = std::filesystem::directory_iterator(dir_path);
204 size_t size_bytes = 0;
207 std::string filename =
"";
211 std::filesystem::directory_iterator iterator;
212 std::filesystem::path dir_path;
215 std::ios_base::openmode toMode(
int flags) {
216 return (std::ios_base::openmode)flags;
226 bool begin(
int cs = SS,
int speed = 0) {
return true; }
232 void errorHalt(
const char *msg) {
236 void initErrorHalt() { exit(0); }
238 bool exists(
const char *name) {
240 return stat(name, &info) == 0;
243 File open(
const char *name,
int flags = O_READ) {
245 file.open(name, flags);
249 bool remove(
const char *name) {
return std::remove(name) == 0; }
250 bool mkdir(
const char *name) { return ::mkdir(name, 0777) == 0; }
251 bool rmdir(
const char *path) {
252 int rc = ::rmdir(path);
255 uint64_t totalBytes() {
257 const std::filesystem::space_info si = std::filesystem::space(
"/home", ec);
260 uint64_t usedBytes() {
262 const std::filesystem::space_info si = std::filesystem::space(
"/home", ec);
263 return si.capacity - si.available;