implement std.os.rename for windows

This commit is contained in:
Andrew Kelley 2017-10-14 17:56:18 -04:00
parent 61d715d784
commit 531f3344dc
2 changed files with 40 additions and 20 deletions

View File

@ -674,6 +674,15 @@ pub fn rename(allocator: &Allocator, old_path: []const u8, new_path: []const u8)
mem.copy(u8, new_buf, new_path); mem.copy(u8, new_buf, new_path);
new_buf[new_path.len] = 0; new_buf[new_path.len] = 0;
if (is_windows) {
const flags = windows.MOVEFILE_REPLACE_EXISTING|windows.MOVEFILE_WRITE_THROUGH;
if (!windows.MoveFileExA(old_buf.ptr, new_buf.ptr, flags)) {
const err = windows.GetLastError();
return switch (err) {
else => return error.Unexpected,
};
}
} else {
const err = posix.getErrno(posix.rename(old_buf.ptr, new_buf.ptr)); const err = posix.getErrno(posix.rename(old_buf.ptr, new_buf.ptr));
if (err > 0) { if (err > 0) {
return switch (err) { return switch (err) {
@ -696,6 +705,7 @@ pub fn rename(allocator: &Allocator, old_path: []const u8, new_path: []const u8)
}; };
} }
} }
}
pub fn makeDir(allocator: &Allocator, dir_path: []const u8) -> %void { pub fn makeDir(allocator: &Allocator, dir_path: []const u8) -> %void {
if (is_windows) { if (is_windows) {

View File

@ -57,6 +57,9 @@ pub extern "kernel32" stdcallcc fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBy
pub extern "kernel32" stdcallcc fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL; pub extern "kernel32" stdcallcc fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL;
pub extern "kernel32" stdcallcc fn MoveFileExA(lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR,
dwFlags: DWORD) -> BOOL;
pub extern "kernel32" stdcallcc fn ReadFile(in_hFile: HANDLE, out_lpBuffer: LPVOID, pub extern "kernel32" stdcallcc fn ReadFile(in_hFile: HANDLE, out_lpBuffer: LPVOID,
in_nNumberOfBytesToRead: DWORD, out_lpNumberOfBytesRead: &DWORD, in_nNumberOfBytesToRead: DWORD, out_lpNumberOfBytesRead: &DWORD,
in_out_lpOverlapped: ?&OVERLAPPED) -> BOOL; in_out_lpOverlapped: ?&OVERLAPPED) -> BOOL;
@ -258,3 +261,10 @@ pub const WAIT_FAILED = 0xFFFFFFFF;
pub const HANDLE_FLAG_INHERIT = 0x00000001; pub const HANDLE_FLAG_INHERIT = 0x00000001;
pub const HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x00000002; pub const HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x00000002;
pub const MOVEFILE_COPY_ALLOWED = 2;
pub const MOVEFILE_CREATE_HARDLINK = 16;
pub const MOVEFILE_DELAY_UNTIL_REBOOT = 4;
pub const MOVEFILE_FAIL_IF_NOT_TRACKABLE = 32;
pub const MOVEFILE_REPLACE_EXISTING = 1;
pub const MOVEFILE_WRITE_THROUGH = 8;