103 if (filename ==
"")
return false;
104 if (is_dir)
return true;
105 bool result = file.is_open();
109 bool open(
const char *name,
int flags) {
110 this->filename = name;
111 int rc = stat(name, &info);
112 if ((flags == O_RDONLY) && rc == -1) {
115 }
else if (rc == 0 && info.st_mode & S_IFDIR) {
122 dir_path = std::filesystem::path(filename);
123 iterator = std::filesystem::directory_iterator({dir_path});
130 size_bytes = rc != -1 ? info.st_size : 0;
131 file.open(filename.c_str(), toMode(flags));
141 size_t read(uint8_t *buffer,
size_t length) {
142 return readBytes((
char *)buffer, length);
145 size_t readBytes(
char *buffer,
size_t length) {
146 file.read(buffer, length);
147 return static_cast<size_t>(file.gcount());
150 size_t write(
const uint8_t *buffer,
size_t size)
override {
151 file.write((
const char *)buffer, size);
152 return file.good() ? size : 0;
154 size_t write(uint8_t ch)
override {
156 return file.good() ? 1 : 0;
158 int available()
override {
return size_bytes - file.tellg(); };
159 int availableForWrite()
override {
return 1024; }
160 int read()
override {
return file.get(); }
161 int peek()
override {
return file.peek(); }
162 void flush()
override {}
163 void getName(
char *str,
size_t len) { strncpy(str, filename.c_str(), len); }
164 bool isDir() {
return is_dir; }
165 bool isHidden() {
return false; }
170 bool openNext(
File &dir,
int flags = O_RDONLY) {
171 if (!*
this)
return false;
179 if (iterator != end(iterator)) {
180 std::filesystem::directory_entry entry = *iterator++;
181 return dir.open(entry.path().c_str(), flags);
186 int dirIndex() {
return pos; }
188 File openNextFile() {
190 openNext(next_file, O_RDONLY);
195 int rc = stat(filename.c_str(), &info);
196 size_bytes = rc != -1 ? info.st_size : 0;
200 size_t position() {
return file.tellg(); }
202 bool seek(
size_t pos) {
204 return file ? true :
false;
207 operator bool() {
return isOpen(); }
209 bool isDirectory() {
return is_dir; }
211 const char *name() {
return filename.c_str(); }
213 void rewindDirectory() {
217 iterator = std::filesystem::directory_iterator(dir_path);
226 size_t size_bytes = 0;
229 std::string filename =
"";
233 std::filesystem::directory_iterator iterator;
234 std::filesystem::path dir_path;
237 std::ios_base::openmode toMode(
int flags) {
238 return (std::ios_base::openmode)flags;
248 bool begin(
int cs = SS,
int speed = 0) {
return true; }
254 void errorHalt(
const char *msg) {
258 void initErrorHalt() { exit(0); }
260 bool exists(
const char *name) {
262 return stat(name, &info) == 0;
265 File open(
const char *name,
int flags = O_READ) {
267 file.open(name, flags);
271 bool remove(
const char *name) {
return std::remove(name) == 0; }
272 bool mkdir(
const char *name) {
274 return ::_mkdir(name) == 0;
276 return ::mkdir(name, 0777) == 0;
279 bool rmdir(
const char *path) {
280 int rc = ::rmdir(path);
292 const std::filesystem::path root = std::filesystem::current_path(ec);
293 if (ec || !std::filesystem::exists(root, ec) || ec) {
297 const auto status = std::filesystem::status(root, ec);
302 return (status.permissions() & std::filesystem::perms::owner_write) !=
303 std::filesystem::perms::none;
312 uint64_t totalBytes() {
314 const std::filesystem::space_info si =
315 std::filesystem::space(std::filesystem::current_path(ec), ec);
316 return ec ? 0 : si.capacity;
318 uint64_t usedBytes() {
320 const std::filesystem::space_info si =
321 std::filesystem::space(std::filesystem::current_path(ec), ec);
322 return ec ? 0 : si.capacity - si.available;