16absl::StatusOr<std::vector<uint8_t>>
ReadWholeFile(
const std::string& path) {
17 std::ifstream in(path, std::ios::binary | std::ios::ate);
19 return absl::NotFoundError(
20 absl::StrFormat(
"could not open '%s' for reading", path));
22 std::streamsize size = in.tellg();
24 return absl::InternalError(
25 absl::StrFormat(
"could not determine size of '%s'", path));
27 in.seekg(0, std::ios::beg);
28 std::vector<uint8_t> data(
static_cast<size_t>(size));
29 if (size > 0 && !in.read(
reinterpret_cast<char*
>(data.data()), size)) {
30 return absl::InternalError(absl::StrFormat(
"short read on '%s'", path));
36 const std::vector<uint8_t>& data) {
41 std::ofstream out(tmp, std::ios::binary | std::ios::trunc);
43 return absl::InternalError(
44 absl::StrFormat(
"could not open '%s' for writing", tmp.string()));
47 !out.write(
reinterpret_cast<const char*
>(data.data()),
48 static_cast<std::streamsize
>(data.size()))) {
49 return absl::InternalError(
50 absl::StrFormat(
"short write on '%s'", tmp.string()));
54 fs::rename(tmp, dest, ec);
59 fs::copy_file(tmp, dest, fs::copy_options::overwrite_existing, ec);
61 return absl::InternalError(
62 absl::StrFormat(
"could not move '%s' to '%s': %s", tmp.string(),
63 dest.string(), ec.message()));
65 std::error_code remove_ec;
66 fs::remove(tmp, remove_ec);
68 return absl::OkStatus();