@@ -1047,8 +1047,22 @@ pub fn readdir(p: &Path) -> io::Result<ReadDir> {
1047
1047
let path = maybe_verbatim ( & star) ?;
1048
1048
1049
1049
unsafe {
1050
- let mut wfd = mem:: zeroed ( ) ;
1051
- let find_handle = c:: FindFirstFileW ( path. as_ptr ( ) , & mut wfd) ;
1050
+ let mut wfd: c:: WIN32_FIND_DATAW = mem:: zeroed ( ) ;
1051
+ // this is like FindFirstFileW (see https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstfileexw),
1052
+ // but with FindExInfoBasic it should skip filling WIN32_FIND_DATAW.cAlternateFileName
1053
+ // (see https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-win32_find_dataw)
1054
+ // (which will be always null string value and currently unused) and should be faster.
1055
+ //
1056
+ // We can pass FIND_FIRST_EX_LARGE_FETCH to dwAdditionalFlags to speed up things more,
1057
+ // but as we don't know user's use profile of this function, lets be conservative.
1058
+ let find_handle = c:: FindFirstFileExW (
1059
+ path. as_ptr ( ) ,
1060
+ c:: FindExInfoBasic ,
1061
+ & mut wfd as * mut _ as _ ,
1062
+ c:: FindExSearchNameMatch ,
1063
+ ptr:: null ( ) ,
1064
+ 0 ,
1065
+ ) ;
1052
1066
1053
1067
if find_handle != c:: INVALID_HANDLE_VALUE {
1054
1068
Ok ( ReadDir {
@@ -1242,8 +1256,15 @@ fn metadata(path: &Path, reparse: ReparsePoint) -> io::Result<FileAttr> {
1242
1256
// `ERROR_SHARING_VIOLATION` means the file exists (but is locked)
1243
1257
// therefore it's safe to assume the file name given does not
1244
1258
// include wildcards.
1245
- let mut wfd = mem:: zeroed ( ) ;
1246
- let handle = c:: FindFirstFileW ( path. as_ptr ( ) , & mut wfd) ;
1259
+ let mut wfd: c:: WIN32_FIND_DATAW = mem:: zeroed ( ) ;
1260
+ let handle = c:: FindFirstFileExW (
1261
+ path. as_ptr ( ) ,
1262
+ c:: FindExInfoBasic ,
1263
+ & mut wfd as * mut _ as _ ,
1264
+ c:: FindExSearchNameMatch ,
1265
+ ptr:: null ( ) ,
1266
+ 0 ,
1267
+ ) ;
1247
1268
1248
1269
if handle == c:: INVALID_HANDLE_VALUE {
1249
1270
// This can fail if the user does not have read access to the
0 commit comments