如何即时检查Windows映射网络驱动器是否可用且无阻塞?
无阻塞检查Windows映射网络驱动器可用性的方法
以下几种方法可避免长时间阻塞,无需额外创建线程:
异步IO结合
CreateFile自定义超时
核心思路是通过异步打开网络驱动器根目录,配合短超时判断可用性,避开系统默认的长等待机制:BOOL CheckDriveAvailability(const wchar_t* drivePath) { HANDLE hDrive = CreateFile(drivePath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hDrive == INVALID_HANDLE_VALUE) { return FALSE; } OVERLAPPED ov = {0}; ov.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); ReadFile(hDrive, NULL, 0, NULL, &ov); DWORD waitStatus = WaitForSingleObject(ov.hEvent, 1000); // 设置1秒超时 BOOL isAvailable = (waitStatus == WAIT_OBJECT_0); if (!isAvailable) { CancelIo(hDrive); } CloseHandle(ov.hEvent); CloseHandle(hDrive); return isAvailable; }调用时传入
L"Z:\\"这类路径即可,超时时间可根据需求调整(如500ms),不会出现一分钟的阻塞情况。先通过ICMP快速检测服务器状态
从注册表HKEY_CURRENT_USER\Network枚举已映射驱动器对应的远程共享路径,提取服务器名称后,用ICMP协议快速ping服务器(设置短超时):- 用
getaddrinfo解析服务器名称到IP地址 - 调用
ICMPCreateFile和IcmpSendEcho,设置500ms左右的超时 - 如果ping不通,直接判定驱动器不可用;如果ping通,再用异步IO验证共享路径
注意:该方法可能受防火墙限制,需结合实际场景使用。
- 用
利用
WNetEnumResource枚举在线资源
调用WNetOpenEnum和WNetEnumResource枚举当前已连接的网络资源,对比本地映射的驱动器列表。只有枚举到的资源才是当前在线的,这种方式不会触发阻塞,因为只枚举已建立连接的资源,不会尝试重新连接离线服务器。
内容的提问来源于stack exchange,提问作者Marus Gradinaru
相关产品推荐
相关产品推荐

