authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-14 17:56:18-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-14 17:56:18-04:00
log531f3344dc219d851e652febebd698caa9d24d0f
treecc585d3c1d7de98341a9062305185da14d8c845b
parent61d715d784f3969ed9cff8b9f16cb6a051d3533a

implement std.os.rename for windows


2 files changed, 40 insertions(+), 20 deletions(-)

std/os/index.zig+30-20
...@@ -674,26 +674,36 @@ pub fn rename(allocator: &Allocator, old_path: []const u8, new_path: []const u8)...@@ -674,26 +674,36 @@ pub fn rename(allocator: &Allocator, old_path: []const u8, new_path: []const u8)
674 mem.copy(u8, new_buf, new_path);674 mem.copy(u8, new_buf, new_path);
675 new_buf[new_path.len] = 0;675 new_buf[new_path.len] = 0;
676676
677 const err = posix.getErrno(posix.rename(old_buf.ptr, new_buf.ptr));677 if (is_windows) {
678 if (err > 0) {678 const flags = windows.MOVEFILE_REPLACE_EXISTING|windows.MOVEFILE_WRITE_THROUGH;
679 return switch (err) {679 if (!windows.MoveFileExA(old_buf.ptr, new_buf.ptr, flags)) {
680 posix.EACCES, posix.EPERM => error.AccessDenied,680 const err = windows.GetLastError();
681 posix.EBUSY => error.FileBusy,681 return switch (err) {
682 posix.EDQUOT => error.DiskQuota,682 else => return error.Unexpected,
683 posix.EFAULT, posix.EINVAL => unreachable,683 };
684 posix.EISDIR => error.IsDir,684 }
685 posix.ELOOP => error.SymLinkLoop,685 } else {
686 posix.EMLINK => error.LinkQuotaExceeded,686 const err = posix.getErrno(posix.rename(old_buf.ptr, new_buf.ptr));
687 posix.ENAMETOOLONG => error.NameTooLong,687 if (err > 0) {
688 posix.ENOENT => error.FileNotFound,688 return switch (err) {
689 posix.ENOTDIR => error.NotDir,689 posix.EACCES, posix.EPERM => error.AccessDenied,
690 posix.ENOMEM => error.SystemResources,690 posix.EBUSY => error.FileBusy,
691 posix.ENOSPC => error.NoSpaceLeft,691 posix.EDQUOT => error.DiskQuota,
692 posix.EEXIST, posix.ENOTEMPTY => error.PathAlreadyExists,692 posix.EFAULT, posix.EINVAL => unreachable,
693 posix.EROFS => error.ReadOnlyFileSystem,693 posix.EISDIR => error.IsDir,
694 posix.EXDEV => error.RenameAcrossMountPoints,694 posix.ELOOP => error.SymLinkLoop,
695 else => error.Unexpected,695 posix.EMLINK => error.LinkQuotaExceeded,
696 };696 posix.ENAMETOOLONG => error.NameTooLong,
697 posix.ENOENT => error.FileNotFound,
698 posix.ENOTDIR => error.NotDir,
699 posix.ENOMEM => error.SystemResources,
700 posix.ENOSPC => error.NoSpaceLeft,
701 posix.EEXIST, posix.ENOTEMPTY => error.PathAlreadyExists,
702 posix.EROFS => error.ReadOnlyFileSystem,
703 posix.EXDEV => error.RenameAcrossMountPoints,
704 else => error.Unexpected,
705 };
706 }
697 }707 }
698}708}
699709
std/os/windows/index.zig+10
...@@ -57,6 +57,9 @@ pub extern "kernel32" stdcallcc fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBy...@@ -57,6 +57,9 @@ pub extern "kernel32" stdcallcc fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBy
5757
58pub extern "kernel32" stdcallcc fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL;58pub extern "kernel32" stdcallcc fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL;
5959
60pub extern "kernel32" stdcallcc fn MoveFileExA(lpExistingFileName: LPCSTR, lpNewFileName: LPCSTR,
61 dwFlags: DWORD) -> BOOL;
62
60pub extern "kernel32" stdcallcc fn ReadFile(in_hFile: HANDLE, out_lpBuffer: LPVOID,63pub extern "kernel32" stdcallcc fn ReadFile(in_hFile: HANDLE, out_lpBuffer: LPVOID,
61 in_nNumberOfBytesToRead: DWORD, out_lpNumberOfBytesRead: &DWORD,64 in_nNumberOfBytesToRead: DWORD, out_lpNumberOfBytesRead: &DWORD,
62 in_out_lpOverlapped: ?&OVERLAPPED) -> BOOL;65 in_out_lpOverlapped: ?&OVERLAPPED) -> BOOL;
...@@ -258,3 +261,10 @@ pub const WAIT_FAILED = 0xFFFFFFFF;...@@ -258,3 +261,10 @@ pub const WAIT_FAILED = 0xFFFFFFFF;
258261
259pub const HANDLE_FLAG_INHERIT = 0x00000001;262pub const HANDLE_FLAG_INHERIT = 0x00000001;
260pub const HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x00000002;263pub const HANDLE_FLAG_PROTECT_FROM_CLOSE = 0x00000002;
264
265pub const MOVEFILE_COPY_ALLOWED = 2;
266pub const MOVEFILE_CREATE_HARDLINK = 16;
267pub const MOVEFILE_DELAY_UNTIL_REBOOT = 4;
268pub const MOVEFILE_FAIL_IF_NOT_TRACKABLE = 32;
269pub const MOVEFILE_REPLACE_EXISTING = 1;
270pub const MOVEFILE_WRITE_THROUGH = 8;