// Copyright (c) 2023 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #include "File.hpp" using namespace Dawn; File::File(std::string filename) { this->filename = fileNormalizeSlashesNew(filename); } bool_t File::open(enum FileMode mode) { assertNull(this->file); this->mode = mode; this->file = fopen( this->filename.c_str(), mode == FILE_MODE_READ ? "rb" : "wb" ); if(this->file == NULL) return false; if(mode == FILE_MODE_READ) { fseek(this->file, 0, SEEK_END); this->length = ftell(this->file); fseek(this->file, 0, SEEK_SET); if(this->length <= 0) { this->close(); return false; } } else { this->length = 0; } return true; } bool_t File::isOpen() { return this->file != nullptr; } void File::close() { assertNotNull(this->file); fclose(this->file); this->file = nullptr; } bool_t File::mkdirp() { fileMkdirp((char*)this->filename.c_str()); return true; } bool_t File::readString(std::string *out) { assertNotNull(out); if(!this->isOpen()) { if(!this->open(FILE_MODE_READ)) return false; } assertTrue(this->mode == FILE_MODE_READ); out->clear(); size_t i = 0; char buffer[FILE_BUFFER_SIZE + 1];// +1 for null term while(i != this->length) { size_t amt = mathMin(FILE_BUFFER_SIZE, (this->length - i)); auto amtRead = fread(buffer, sizeof(char), amt, this->file); if(amtRead != amt) return false; i += amtRead; buffer[amtRead] = '\0'; out->append(buffer); } return true; } bool_t File::writeString(std::string in) { if(!this->isOpen()) { if(!this->open(FILE_MODE_WRITE)) return false; } assertTrue(this->mode == FILE_MODE_WRITE); const char_t *strOut = in.c_str(); // TODO: Validate write length. this->length = fwrite(strOut, sizeof(char_t), in.size(), this->file); return true; } File::~File() { if(this->file != nullptr) this->close(); }