@@ -81,6 +81,8 @@ pub struct OpenOptions {
8181 share_mode : u32 ,
8282 security_qos_flags : u32 ,
8383 inherit_handle : bool ,
84+ freeze_last_access_time : bool ,
85+ freeze_last_write_time : bool ,
8486}
8587
8688#[ derive( Clone , PartialEq , Eq , Debug ) ]
@@ -204,6 +206,8 @@ impl OpenOptions {
204206 attributes : 0 ,
205207 security_qos_flags : 0 ,
206208 inherit_handle : false ,
209+ freeze_last_access_time : false ,
210+ freeze_last_write_time : false ,
207211 }
208212 }
209213
@@ -246,6 +250,12 @@ impl OpenOptions {
246250 pub fn inherit_handle ( & mut self , inherit : bool ) {
247251 self . inherit_handle = inherit;
248252 }
253+ pub fn freeze_last_access_time ( & mut self , freeze : bool ) {
254+ self . freeze_last_access_time = freeze;
255+ }
256+ pub fn freeze_last_write_time ( & mut self , freeze : bool ) {
257+ self . freeze_last_write_time = freeze;
258+ }
249259
250260 fn get_access_mode ( & self ) -> io:: Result < u32 > {
251261 match ( self . read , self . write , self . append , self . access_mode ) {
@@ -343,6 +353,18 @@ impl File {
343353 } ;
344354 let handle = unsafe { HandleOrInvalid :: from_raw_handle ( handle) } ;
345355 if let Ok ( handle) = OwnedHandle :: try_from ( handle) {
356+ if opts. freeze_last_access_time || opts. freeze_last_write_time {
357+ let file_time =
358+ c:: FILETIME { dwLowDateTime : 0xFFFFFFFF , dwHighDateTime : 0xFFFFFFFF } ;
359+ cvt ( unsafe {
360+ c:: SetFileTime (
361+ handle. as_raw_handle ( ) ,
362+ core:: ptr:: null ( ) ,
363+ if opts. freeze_last_access_time { & file_time } else { core:: ptr:: null ( ) } ,
364+ if opts. freeze_last_write_time { & file_time } else { core:: ptr:: null ( ) } ,
365+ )
366+ } ) ?;
367+ }
346368 // Manual truncation. See #115745.
347369 if opts. truncate
348370 && creation == c:: OPEN_ALWAYS
0 commit comments