Browse Source

`safe_rename` automatically falls back to copy in case of cross_device_link

default_compile_flags
vector-of-bool 5 years ago
parent
commit
6a5859738a
2 changed files with 31 additions and 0 deletions
  1. +29
    -0
      src/dds/util.cpp
  2. +2
    -0
      src/dds/util.hpp

+ 29
- 0
src/dds/util.cpp View File

#include "./util.hpp" #include "./util.hpp"


#include <spdlog/fmt/fmt.h>

#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
out << file.rdbuf(); out << file.rdbuf();
return std::move(out).str(); return std::move(out).str();
} }

void dds::safe_rename(path_ref source, path_ref dest) {
std::error_code ec;
fs::rename(source, dest, ec);
if (!ec) {
return;
}

if (ec != std::errc::cross_device_link) {
throw std::system_error(ec,
fmt::format("Failed to move item [{}] to [{}]",
source.string(),
dest.string()));
}

auto tmp = dest;
tmp.replace_filename(tmp.filename().string() + ".tmp-dds-mv");
try {
fs::remove_all(tmp);
fs::copy(source, tmp, fs::copy_options::recursive);
} catch (...) {
fs::remove_all(tmp, ec);
throw;
}
fs::rename(tmp, dest);
fs::remove_all(source);
}

+ 2
- 0
src/dds/util.hpp View File

return contents; return contents;
} }


void safe_rename(path_ref source, path_ref dest);

} // namespace file_utils } // namespace file_utils


template <typename Container, typename Predicate> template <typename Container, typename Predicate>

Loading…
Cancel
Save