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)
674674 mem.copy(u8, new_buf, new_path);
675675 new_buf[new_path.len] = 0;
676676
677 const err = posix.getErrno(posix.rename(old_buf.ptr, new_buf.ptr));
678 if (err > 0) {
679 return switch (err) {
680 posix.EACCES, posix.EPERM => error.AccessDenied,
681 posix.EBUSY => error.FileBusy,
682 posix.EDQUOT => error.DiskQuota,
683 posix.EFAULT, posix.EINVAL => unreachable,
684 posix.EISDIR => error.IsDir,
685 posix.ELOOP => error.SymLinkLoop,
686 posix.EMLINK => error.LinkQuotaExceeded,
687 posix.ENAMETOOLONG => error.NameTooLong,
688 posix.ENOENT => error.FileNotFound,
689 posix.ENOTDIR => error.NotDir,
690 posix.ENOMEM => error.SystemResources,
691 posix.ENOSPC => error.NoSpaceLeft,
692 posix.EEXIST, posix.ENOTEMPTY => error.PathAlreadyExists,
693 posix.EROFS => error.ReadOnlyFileSystem,
694 posix.EXDEV => error.RenameAcrossMountPoints,
695 else => error.Unexpected,
696 };
677 if (is_windows) {
678 const flags = windows.MOVEFILE_REPLACE_EXISTING|windows.MOVEFILE_WRITE_THROUGH;
679 if (!windows.MoveFileExA(old_buf.ptr, new_buf.ptr, flags)) {
680 const err = windows.GetLastError();
681 return switch (err) {
682 else => return error.Unexpected,
683 };
684 }
685 } else {
686 const err = posix.getErrno(posix.rename(old_buf.ptr, new_buf.ptr));
687 if (err > 0) {
688 return switch (err) {
689 posix.EACCES, posix.EPERM => error.AccessDenied,
690 posix.EBUSY => error.FileBusy,
691 posix.EDQUOT => error.DiskQuota,
692 posix.EFAULT, posix.EINVAL => unreachable,
693 posix.EISDIR => error.IsDir,
694 posix.ELOOP => error.SymLinkLoop,
695 posix.EMLINK => error.LinkQuotaExceeded,
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 }
697707 }
698708}
699709
std/os/windows/index.zig+10
......@@ -57,6 +57,9 @@ pub extern "kernel32" stdcallcc fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBy
5757
5858pub 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
6063pub extern "kernel32" stdcallcc fn ReadFile(in_hFile: HANDLE, out_lpBuffer: LPVOID,
6164 in_nNumberOfBytesToRead: DWORD, out_lpNumberOfBytesRead: &DWORD,
6265 in_out_lpOverlapped: ?&OVERLAPPED) -> BOOL;
......@@ -258,3 +261,10 @@ pub const WAIT_FAILED = 0xFFFFFFFF;
258261
259262pub const HANDLE_FLAG_INHERIT = 0x00000001;
260263pub 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;