use std::fs;
use std::io;
use std::path::Path;
pub(super) use crate::durable_io::sync_dir;
#[cfg(windows)]
pub(super) fn replace_file_atomic(src: &Path, dst: &Path) -> io::Result<()> {
use std::os::windows::ffi::OsStrExt;
const MOVEFILE_REPLACE_EXISTING: u32 = 0x1;
const MOVEFILE_WRITE_THROUGH: u32 = 0x8;
unsafe extern "system" {
fn MoveFileExW(existing: *const u16, new: *const u16, flags: u32) -> i32;
}
fn wide(path: &Path) -> Vec<u16> {
path.as_os_str().encode_wide().chain(Some(0)).collect()
}
let src = wide(src);
let dst = wide(dst);
let rc = unsafe {
MoveFileExW(
src.as_ptr(),
dst.as_ptr(),
MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH,
)
};
if rc == 0 {
Err(io::Error::last_os_error())
} else {
Ok(())
}
}
#[cfg(not(windows))]
pub(super) fn replace_file_atomic(src: &Path, dst: &Path) -> io::Result<()> {
fs::rename(src, dst)
}