replace FindFirstFileW with FindFirstFileExW and apply optimization
This commit is contained in:
parent
22a9a8b76e
commit
8abe67c949
@ -1047,8 +1047,22 @@ pub fn readdir(p: &Path) -> io::Result<ReadDir> {
|
|||||||
let path = maybe_verbatim(&star)?;
|
let path = maybe_verbatim(&star)?;
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut wfd = mem::zeroed();
|
let mut wfd: c::WIN32_FIND_DATAW = mem::zeroed();
|
||||||
let find_handle = c::FindFirstFileW(path.as_ptr(), &mut wfd);
|
// this is like FindFirstFileW (see https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstfileexw),
|
||||||
|
// but with FindExInfoBasic it should skip filling WIN32_FIND_DATAW.cAlternateFileName
|
||||||
|
// (see https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-win32_find_dataw)
|
||||||
|
// (which will be always null string value and currently unused) and should be faster.
|
||||||
|
//
|
||||||
|
// We can pass FIND_FIRST_EX_LARGE_FETCH to dwAdditionalFlags to speed up things more,
|
||||||
|
// but as we don't know user's use profile of this function, lets be conservative.
|
||||||
|
let find_handle = c::FindFirstFileExW(
|
||||||
|
path.as_ptr(),
|
||||||
|
c::FindExInfoBasic,
|
||||||
|
&mut wfd as *mut _ as _,
|
||||||
|
c::FindExSearchNameMatch,
|
||||||
|
ptr::null(),
|
||||||
|
0,
|
||||||
|
);
|
||||||
|
|
||||||
if find_handle != c::INVALID_HANDLE_VALUE {
|
if find_handle != c::INVALID_HANDLE_VALUE {
|
||||||
Ok(ReadDir {
|
Ok(ReadDir {
|
||||||
@ -1242,8 +1256,15 @@ fn metadata(path: &Path, reparse: ReparsePoint) -> io::Result<FileAttr> {
|
|||||||
// `ERROR_SHARING_VIOLATION` means the file exists (but is locked)
|
// `ERROR_SHARING_VIOLATION` means the file exists (but is locked)
|
||||||
// therefore it's safe to assume the file name given does not
|
// therefore it's safe to assume the file name given does not
|
||||||
// include wildcards.
|
// include wildcards.
|
||||||
let mut wfd = mem::zeroed();
|
let mut wfd: c::WIN32_FIND_DATAW = mem::zeroed();
|
||||||
let handle = c::FindFirstFileW(path.as_ptr(), &mut wfd);
|
let handle = c::FindFirstFileExW(
|
||||||
|
path.as_ptr(),
|
||||||
|
c::FindExInfoBasic,
|
||||||
|
&mut wfd as *mut _ as _,
|
||||||
|
c::FindExSearchNameMatch,
|
||||||
|
ptr::null(),
|
||||||
|
0,
|
||||||
|
);
|
||||||
|
|
||||||
if handle == c::INVALID_HANDLE_VALUE {
|
if handle == c::INVALID_HANDLE_VALUE {
|
||||||
// This can fail if the user does not have read access to the
|
// This can fail if the user does not have read access to the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user