From aa170a7eff3b15119561d33f9263ceea5c2c7bee Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 15 Jul 2019 00:02:44 -0400 Subject: implement std.fs.File.updateTimes for windows --- std/os/windows.zig | 24 ++++++++++++++++++++++++ std/os/windows/kernel32.zig | 7 +++++++ 2 files changed, 31 insertions(+) (limited to 'std/os') diff --git a/std/os/windows.zig b/std/os/windows.zig index 60ebf01166..a608839b80 100644 --- a/std/os/windows.zig +++ b/std/os/windows.zig @@ -767,11 +767,35 @@ pub fn GetFileInformationByHandle( return info; } +pub const SetFileTimeError = error{Unexpected}; + +pub fn SetFileTime( + hFile: HANDLE, + lpCreationTime: ?*const FILETIME, + lpLastAccessTime: ?*const FILETIME, + lpLastWriteTime: ?*const FILETIME, +) SetFileTimeError!void { + const rc = kernel32.SetFileTime(hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime); + if (rc == 0) { + switch (kernel32.GetLastError()) { + else => |err| return unexpectedError(err), + } + } +} + pub fn fileTimeToNanoSeconds(ft: FILETIME) u64 { const sec = (u64(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; return sec * std.time.ns_per_s; } +pub fn nanoSecondsToFileTime(ns: u64) FILETIME { + const sec = ns / std.time.ns_per_s; + return FILETIME{ + .dwHighDateTime = @truncate(u32, sec >> 32), + .dwLowDateTime = @truncate(u32, sec), + }; +} + pub fn cStrToPrefixedFileW(s: [*]const u8) ![PATH_MAX_WIDE + 1]u16 { return sliceToPrefixedFileW(mem.toSliceConst(u8, s)); } diff --git a/std/os/windows/kernel32.zig b/std/os/windows/kernel32.zig index de5bd57a5a..e4edc349ab 100644 --- a/std/os/windows/kernel32.zig +++ b/std/os/windows/kernel32.zig @@ -170,6 +170,13 @@ pub extern "kernel32" stdcallcc fn SetFilePointerEx( in_dwMoveMethod: DWORD, ) BOOL; +pub extern "kernel32" stdcallcc fn SetFileTime( + hFile: HANDLE, + lpCreationTime: ?*const FILETIME, + lpLastAccessTime: ?*const FILETIME, + lpLastWriteTime: ?*const FILETIME, +) BOOL; + pub extern "kernel32" stdcallcc fn SetHandleInformation(hObject: HANDLE, dwMask: DWORD, dwFlags: DWORD) BOOL; pub extern "kernel32" stdcallcc fn Sleep(dwMilliseconds: DWORD) void; -- cgit v1.2.3