@@ -12,6 +12,8 @@ use crate::sys::handle::Handle;
1212use crate :: sys:: time:: SystemTime ;
1313use crate :: sys:: { c, cvt} ;
1414use crate :: sys_common:: FromInner ;
15+ #[ cfg( target_os = "uwp" ) ]
16+ use libc:: c_void;
1517
1618use super :: to_u16s;
1719
@@ -287,6 +289,7 @@ impl File {
287289 Ok ( ( ) )
288290 }
289291
292+ #[ cfg( not( target_os = "uwp" ) ) ]
290293 pub fn file_attr ( & self ) -> io:: Result < FileAttr > {
291294 unsafe {
292295 let mut info: c:: BY_HANDLE_FILE_INFORMATION = mem:: zeroed ( ) ;
@@ -310,6 +313,43 @@ impl File {
310313 }
311314 }
312315
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+
313353 pub fn read ( & self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
314354 self . handle . read ( buf)
315355 }
0 commit comments