3 use std
::fs
::{self, OpenOptions}
;
5 use std
::os
::windows
::prelude
::*;
10 pub fn set_file_times(p
: &Path
, atime
: FileTime
, mtime
: FileTime
) -> io
::Result
<()> {
11 set_file_times_w(p
, atime
, mtime
, OpenOptions
::new())
14 pub fn set_symlink_file_times(p
: &Path
, atime
: FileTime
, mtime
: FileTime
) -> io
::Result
<()> {
15 use std
::os
::windows
::fs
::OpenOptionsExt
;
16 const FILE_FLAG_OPEN_REPARSE_POINT
: u32 = 0x00200000;
18 let mut options
= OpenOptions
::new();
19 options
.custom_flags(FILE_FLAG_OPEN_REPARSE_POINT
);
20 set_file_times_w(p
, atime
, mtime
, options
)
23 pub fn set_file_times_w(p
: &Path
,
26 mut options
: OpenOptions
) -> io
::Result
<()> {
28 type HANDLE
= *mut u8;
38 fn SetFileTime(hFile
: HANDLE
,
39 lpCreationTime
: *const FILETIME
,
40 lpLastAccessTime
: *const FILETIME
,
41 lpLastWriteTime
: *const FILETIME
) -> BOOL
;
44 let f
= try
!(options
.write(true).open(p
));
45 let atime
= to_filetime(&atime
);
46 let mtime
= to_filetime(&mtime
);
48 let ret
= SetFileTime(f
.as_raw_handle() as *mut _
,
54 Err(io
::Error
::last_os_error())
58 fn to_filetime(ft
: &FileTime
) -> FILETIME
{
59 let intervals
= ft
.seconds() * (1_000_000_000 / 100) +
60 ((ft
.nanoseconds() as u64) / 100);
62 dwLowDateTime
: intervals
as DWORD
,
63 dwHighDateTime
: (intervals
>> 32) as DWORD
,
68 pub fn from_last_modification_time(meta
: &fs
::Metadata
) -> FileTime
{
69 from_intervals(meta
.last_write_time())
72 pub fn from_last_access_time(meta
: &fs
::Metadata
) -> FileTime
{
73 from_intervals(meta
.last_access_time())
76 pub fn from_creation_time(meta
: &fs
::Metadata
) -> Option
<FileTime
> {
77 Some(from_intervals(meta
.creation_time()))
80 fn from_intervals(ticks
: u64) -> FileTime
{
81 // Windows write times are in 100ns intervals, so do a little math to
82 // get it into the right representation.
84 seconds
: ticks
/ (1_000_000_000 / 100),
85 nanos
: ((ticks
% (1_000_000_000 / 100)) * 100) as u32,