Skip to content

File file.h

File List > features > types > file.h

Go to the documentation of this file

#pragma once

#include <filesystem>
#include <fstream>
#include <string>

#include <jac/machine/values.h>

namespace jac {


class File {
    std::fstream _file;
public:
    std::string path_;

    File(std::string path, std::string flags): path_(path) {
        auto openMode = static_cast<std::ios::openmode>(0);
        if (flags.find('r') != std::string::npos) {
            openMode |= std::ios::in;
        }
        if (flags.find('w') != std::string::npos) {
            openMode |= std::ios::out;
        }
        if (flags.find('a') != std::string::npos) {
            openMode |= std::ios::app;
        }
        if (flags.find('b') != std::string::npos) {
            openMode |= std::ios::binary;
        }
        if (flags.find('t') != std::string::npos) {
            openMode |= std::ios::trunc;
        }

        if (openMode == static_cast<std::ios::openmode>(0)) {
            throw jac::Exception::create(jac::Exception::Type::Error, "Invalid file flags");
        }

        this->_file = std::fstream(path, openMode);
        if (!_file.is_open()) {
            throw jac::Exception::create(jac::Exception::Type::Error, "Could not open file: " + path);
        }
    }
    File(std::filesystem::path path, std::string flags): File(path.string(), flags) {}

    std::string read(int length = 1024) {
        std::string buffer;
        buffer.resize(length);
        this->_file.readsome(buffer.data(), length);
        buffer.resize(this->_file.gcount());
        return buffer;
    }

    void write(std::string data) {
        this->_file.write(data.data(), data.size());
    }

    bool isOpen() {
        return this->_file.is_open();
    }

    void close() {
        this->_file.close();
    }

    ~File() {
        this->close();
    }
};


} // namespace jac