@@ -12,6 +12,8 @@ use crate::sys::handle::Handle;
12
12
use crate :: sys:: time:: SystemTime ;
13
13
use crate :: sys:: { c, cvt} ;
14
14
use crate :: sys_common:: FromInner ;
15
+ #[ cfg( target_os = "uwp" ) ]
16
+ use libc:: c_void;
15
17
16
18
use super :: to_u16s;
17
19
@@ -287,6 +289,7 @@ impl File {
287
289
Ok ( ( ) )
288
290
}
289
291
292
+ #[ cfg( not( target_os = "uwp" ) ) ]
290
293
pub fn file_attr ( & self ) -> io:: Result < FileAttr > {
291
294
unsafe {
292
295
let mut info: c:: BY_HANDLE_FILE_INFORMATION = mem:: zeroed ( ) ;
@@ -310,6 +313,43 @@ impl File {
310
313
}
311
314
}
312
315
316
+ #[ cfg( target_os = "uwp" ) ]
317
+ pub fn file_attr ( & self ) -> io:: Result < FileAttr > {
318
+ unsafe {
319
+ let mut info: c:: FILE_BASIC_INFO = mem:: zeroed ( ) ;
320
+ let size = mem:: size_of_val ( & info) ;
321
+ cvt ( c:: GetFileInformationByHandleEx ( self . handle . raw ( ) ,
322
+ c:: FileBasicInfo ,
323
+ & mut info as * mut _ as * mut c_void ,
324
+ size as c:: DWORD ) ) ?;
325
+ let mut attr = FileAttr {
326
+ attributes : info. FileAttributes ,
327
+ creation_time : c:: FILETIME {
328
+ dwLowDateTime : info. CreationTime as c:: DWORD ,
329
+ dwHighDateTime : ( info. CreationTime >> 32 ) as c:: DWORD ,
330
+ } ,
331
+ last_access_time : c:: FILETIME {
332
+ dwLowDateTime : info. LastAccessTime as c:: DWORD ,
333
+ dwHighDateTime : ( info. LastAccessTime >> 32 ) as c:: DWORD ,
334
+ } ,
335
+ last_write_time : c:: FILETIME {
336
+ dwLowDateTime : info. LastWriteTime as c:: DWORD ,
337
+ dwHighDateTime : ( info. LastWriteTime >> 32 ) as c:: DWORD ,
338
+ } ,
339
+ file_size : 0 ,
340
+ reparse_tag : 0 ,
341
+ } ;
342
+ cvt ( c:: GetFileSizeEx ( self . handle . raw ( ) , & mut attr. file_size as * mut _ as * mut i64 ) ) ?;
343
+ if attr. is_reparse_point ( ) {
344
+ let mut b = [ 0 ; c:: MAXIMUM_REPARSE_DATA_BUFFER_SIZE ] ;
345
+ if let Ok ( ( _, buf) ) = self . reparse_point ( & mut b) {
346
+ attr. reparse_tag = buf. ReparseTag ;
347
+ }
348
+ }
349
+ Ok ( attr)
350
+ }
351
+ }
352
+
313
353
pub fn read ( & self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
314
354
self . handle . read ( buf)
315
355
}
0 commit comments