Skip to content

Commit e26f213

Browse files
committed
make modifications as per reviews
1 parent 2241d16 commit e26f213

File tree

1 file changed

+25
-21
lines changed
  • library/std/src/sys/pal/windows

1 file changed

+25
-21
lines changed

library/std/src/sys/pal/windows/fs.rs

+25-21
Original file line numberDiff line numberDiff line change
@@ -1069,34 +1069,38 @@ pub fn readdir(p: &Path) -> io::Result<ReadDir> {
10691069
let mut wfd = mem::zeroed();
10701070
let find_handle = c::FindFirstFileW(path.as_ptr(), &mut wfd);
10711071

1072-
// The status `ERROR_FILE_NOT_FOUND` is returned by the `FindFirstFileW` function
1073-
// if no matching files can be found, but not necessarily that the path to find the
1074-
// files in does not exist.
1075-
//
1076-
// Hence, a check for whether the path to search in exists is added when the last
1077-
// os error returned by Windows is `ERROR_FILE_NOT_FOUND` to handle this scenario.
1078-
// If that is the case, an empty `ReadDir` iterator is returned as it returns `None`
1079-
// in the initial `.next()` invocation because `ERROR_NO_MORE_FILES` would have been
1080-
// returned by the `FindNextFileW` function.
1081-
//
1082-
// See issue #120040: https://github.com/rust-lang/rust/issues/120040.
1083-
let last_error = Error::last_os_error();
1084-
if last_error.raw_os_error().unwrap() == c::ERROR_FILE_NOT_FOUND as i32 && p.exists() {
1085-
return Ok(ReadDir {
1086-
handle: FindNextFileHandle(find_handle),
1087-
root: Arc::new(root),
1088-
first: None,
1089-
});
1090-
}
1091-
10921072
if find_handle != c::INVALID_HANDLE_VALUE {
10931073
Ok(ReadDir {
10941074
handle: FindNextFileHandle(find_handle),
10951075
root: Arc::new(root),
10961076
first: Some(wfd),
10971077
})
10981078
} else {
1099-
Err(last_error)
1079+
// The status `ERROR_FILE_NOT_FOUND` is returned by the `FindFirstFileW` function
1080+
// if no matching files can be found, but not necessarily that the path to find the
1081+
// files in does not exist.
1082+
//
1083+
// Hence, a check for whether the path to search in exists is added when the last
1084+
// os error returned by Windows is `ERROR_FILE_NOT_FOUND` to handle this scenario.
1085+
// If that is the case, an empty `ReadDir` iterator is returned as it returns `None`
1086+
// in the initial `.next()` invocation because `ERROR_NO_MORE_FILES` would have been
1087+
// returned by the `FindNextFileW` function.
1088+
//
1089+
// See issue #120040: https://github.com/rust-lang/rust/issues/120040.
1090+
let last_error = api::get_last_error();
1091+
if last_error.code == c::ERROR_FILE_NOT_FOUND {
1092+
return Ok(ReadDir {
1093+
handle: FindNextFileHandle(find_handle),
1094+
root: Arc::new(root),
1095+
first: None,
1096+
});
1097+
}
1098+
1099+
// Just return the error constructed from the raw OS error if the above is not the case.
1100+
//
1101+
// Note: `ERROR_PATH_NOT_FOUND` would have been returned by the `FindFirstFileW` function
1102+
// when the path to search in does not exist in the first place.
1103+
Err(Error::from_raw_os_error(last_error.code as i32));
11001104
}
11011105
}
11021106
}

0 commit comments

Comments
 (0)