#include #include #include #include #include "filesystem.h" //Only use on small files std::string filesystem::read(const std::string &path) { std::stringstream ss; std::ifstream input(path, std::ofstream::binary); if(input) { ss << input.rdbuf(); input.close(); } return ss.str(); } //Only use on small files std::vector filesystem::read_lines(const std::string &path) { std::vector res; std::ifstream input(path, std::ofstream::binary); if (input) { do { res.emplace_back(); } while(getline(input, res.back())); } input.close(); return res; } //Only use on small files bool filesystem::write(const std::string &path, const std::string &new_content) { std::ofstream output(path, std::ofstream::binary); if(output) output << new_content; else return false; output.close(); return true; } std::string filesystem::escape_argument(const std::string &argument) { auto escaped=argument; for(size_t pos=0;pos=2) { if((unescaped[0]=='\'' && unescaped[unescaped.size()-1]=='\'') || (unescaped[0]=='"' && unescaped[unescaped.size()-1]=='"')) { char quotation_mark=unescaped[0]; unescaped=unescaped.substr(1, unescaped.size()-2); size_t backslash_count=0; for(size_t pos=0;pos environment_variables = {"HOME", "AppData"}; char *ptr = nullptr; for (auto &variable : environment_variables) { ptr=std::getenv(variable.c_str()); boost::system::error_code ec; if (ptr!=nullptr && boost::filesystem::exists(ptr, ec)) return ptr; } return boost::filesystem::path(); } boost::filesystem::path filesystem::get_short_path(const boost::filesystem::path &path) noexcept { #ifdef _WIN32 return path; #else static auto home_path=get_home_path(); if(!home_path.empty()) { auto relative_path=filesystem::get_relative_path(path, home_path); if(!relative_path.empty()) return "~"/relative_path; } return path; #endif } bool filesystem::file_in_path(const boost::filesystem::path &file_path, const boost::filesystem::path &path) { if(std::distance(file_path.begin(), file_path.end())