diff options
Diffstat (limited to 'toolsrc/src/vcpkg_Files.cpp')
| -rw-r--r-- | toolsrc/src/vcpkg_Files.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/toolsrc/src/vcpkg_Files.cpp b/toolsrc/src/vcpkg_Files.cpp new file mode 100644 index 000000000..49a661157 --- /dev/null +++ b/toolsrc/src/vcpkg_Files.cpp @@ -0,0 +1,38 @@ +#include "vcpkg_Files.h" +#include <fstream> +#include <filesystem> + +namespace fs = std::tr2::sys; + +namespace vcpkg {namespace Files +{ + void check_is_directory(const fs::path& dirpath) + { + Checks::check_throw(fs::is_directory(dirpath), "The path %s is not a directory", dirpath.string()); + } + + expected<std::string> get_contents(const fs::path& file_path) noexcept + { + std::fstream file_stream(file_path, std::ios_base::in | std::ios_base::binary); + if (file_stream.fail()) + { + return std::errc::no_such_file_or_directory; + } + + file_stream.seekg(0, file_stream.end); + auto length = file_stream.tellg(); + file_stream.seekg(0, file_stream.beg); + + if (length > SIZE_MAX) + { + return std::errc::file_too_large; + } + + std::string output; + output.resize(static_cast<size_t>(length)); + file_stream.read(&output[0], length); + file_stream.close(); + + return std::move(output); + } +}} |
