mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Fix change_times on Windows and simplify time handling in stat
This commit is contained in:
@@ -813,19 +813,11 @@ _chtimes :: proc(name: string, atime, mtime: time.Time) -> Error {
|
|||||||
defer close(f)
|
defer close(f)
|
||||||
return _fchtimes(f, atime, mtime)
|
return _fchtimes(f, atime, mtime)
|
||||||
}
|
}
|
||||||
|
|
||||||
_fchtimes :: proc(f: ^File, atime, mtime: time.Time) -> Error {
|
_fchtimes :: proc(f: ^File, atime, mtime: time.Time) -> Error {
|
||||||
if f == nil || f.impl == nil {
|
if f == nil || f.impl == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
d: win32.BY_HANDLE_FILE_INFORMATION
|
|
||||||
if !win32.GetFileInformationByHandle(_handle(f), &d) {
|
|
||||||
return _get_platform_error()
|
|
||||||
}
|
|
||||||
|
|
||||||
to_windows_time :: #force_inline proc(t: time.Time) -> win32.LARGE_INTEGER {
|
|
||||||
// a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC)
|
|
||||||
return win32.LARGE_INTEGER(time.time_to_unix_nano(t) * 100 + 116444736000000000)
|
|
||||||
}
|
|
||||||
|
|
||||||
atime, mtime := atime, mtime
|
atime, mtime := atime, mtime
|
||||||
if time.time_to_unix_nano(atime) < time.time_to_unix_nano(mtime) {
|
if time.time_to_unix_nano(atime) < time.time_to_unix_nano(mtime) {
|
||||||
@@ -833,9 +825,9 @@ _fchtimes :: proc(f: ^File, atime, mtime: time.Time) -> Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
info: win32.FILE_BASIC_INFO
|
info: win32.FILE_BASIC_INFO
|
||||||
info.LastAccessTime = to_windows_time(atime)
|
info.LastAccessTime = time_as_filetime(atime)
|
||||||
info.LastWriteTime = to_windows_time(mtime)
|
info.LastWriteTime = time_as_filetime(mtime)
|
||||||
if !win32.SetFileInformationByHandle(_handle(f), .FileBasicInfo, &info, size_of(d)) {
|
if !win32.SetFileInformationByHandle(_handle(f), .FileBasicInfo, &info, size_of(info)) {
|
||||||
return _get_platform_error()
|
return _get_platform_error()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -239,14 +239,30 @@ _file_type_mode_from_file_attributes :: proc(file_attributes: win32.DWORD, h: wi
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC)
|
||||||
|
time_as_filetime :: #force_inline proc(t: time.Time) -> (ft: win32.LARGE_INTEGER) {
|
||||||
|
win := u64(t._nsec / 100) + 116444736000000000
|
||||||
|
return win32.LARGE_INTEGER(win)
|
||||||
|
}
|
||||||
|
|
||||||
|
filetime_as_time_li :: #force_inline proc(ft: win32.LARGE_INTEGER) -> (t: time.Time) {
|
||||||
|
return {_nsec=(i64(ft) - 116444736000000000) * 100}
|
||||||
|
}
|
||||||
|
|
||||||
|
filetime_as_time_ft :: #force_inline proc(ft: win32.FILETIME) -> (t: time.Time) {
|
||||||
|
return filetime_as_time_li(win32.LARGE_INTEGER(ft.dwLowDateTime) + win32.LARGE_INTEGER(ft.dwHighDateTime) << 32)
|
||||||
|
}
|
||||||
|
|
||||||
|
filetime_as_time :: proc{filetime_as_time_ft, filetime_as_time_li}
|
||||||
|
|
||||||
_file_info_from_win32_file_attribute_data :: proc(d: ^win32.WIN32_FILE_ATTRIBUTE_DATA, name: string, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) {
|
_file_info_from_win32_file_attribute_data :: proc(d: ^win32.WIN32_FILE_ATTRIBUTE_DATA, name: string, allocator: runtime.Allocator) -> (fi: File_Info, e: Error) {
|
||||||
fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow)
|
fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow)
|
||||||
type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0)
|
type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0)
|
||||||
fi.type = type
|
fi.type = type
|
||||||
fi.mode |= mode
|
fi.mode |= mode
|
||||||
fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime))
|
fi.creation_time = filetime_as_time(d.ftCreationTime)
|
||||||
fi.modification_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastWriteTime))
|
fi.modification_time = filetime_as_time(d.ftLastWriteTime)
|
||||||
fi.access_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastAccessTime))
|
fi.access_time = filetime_as_time(d.ftLastAccessTime)
|
||||||
fi.fullpath, e = full_path_from_name(name, allocator)
|
fi.fullpath, e = full_path_from_name(name, allocator)
|
||||||
fi.name = basename(fi.fullpath)
|
fi.name = basename(fi.fullpath)
|
||||||
return
|
return
|
||||||
@@ -257,9 +273,9 @@ _file_info_from_win32_find_data :: proc(d: ^win32.WIN32_FIND_DATAW, name: string
|
|||||||
type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0)
|
type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0)
|
||||||
fi.type = type
|
fi.type = type
|
||||||
fi.mode |= mode
|
fi.mode |= mode
|
||||||
fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime))
|
fi.creation_time = filetime_as_time(d.ftCreationTime)
|
||||||
fi.modification_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastWriteTime))
|
fi.modification_time = filetime_as_time(d.ftLastWriteTime)
|
||||||
fi.access_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastAccessTime))
|
fi.access_time = filetime_as_time(d.ftLastAccessTime)
|
||||||
fi.fullpath, e = full_path_from_name(name, allocator)
|
fi.fullpath, e = full_path_from_name(name, allocator)
|
||||||
fi.name = basename(fi.fullpath)
|
fi.name = basename(fi.fullpath)
|
||||||
return
|
return
|
||||||
@@ -289,9 +305,9 @@ _file_info_from_get_file_information_by_handle :: proc(path: string, h: win32.HA
|
|||||||
type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, h, 0)
|
type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, h, 0)
|
||||||
fi.type = type
|
fi.type = type
|
||||||
fi.mode |= mode
|
fi.mode |= mode
|
||||||
fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime))
|
fi.creation_time = filetime_as_time(d.ftCreationTime)
|
||||||
fi.modification_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastWriteTime))
|
fi.modification_time = filetime_as_time(d.ftLastWriteTime)
|
||||||
fi.access_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftLastAccessTime))
|
fi.access_time = filetime_as_time(d.ftLastAccessTime)
|
||||||
return fi, nil
|
return fi, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user