将C# UNC路径转换函数转为VB.NET时遇「未找到」异常求助
问题排查与修复步骤
1. 修正WMI查询语句格式
VB.NET中WMI查询的盘符必须用单引号包裹,比如映射驱动器P:要写成"Win32_LogicalDisk.DeviceID='P:'",本地盘符C:写成"Win32_LogicalDisk.DeviceID='C:'"。如果格式错误,会返回空的ManagementObject,导致访问属性时抛出「Not found」异常。
2. 先校验ManagementObject是否存在
在访问属性前必须判断对象是否为Nothing,避免空对象访问:
Dim searcher As New ManagementObjectSearcher($"SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{driveLetter}:'") Dim collection As ManagementObjectCollection = searcher.Get() Dim mo As ManagementObject = collection.Cast(Of ManagementObject)().FirstOrDefault() If mo Is Nothing Then Return originalPath ' 找不到对应盘符时返回原路径 End If
3. 正确访问WMI属性
WMI属性名称区分大小写,确保"DriveType"和"ProviderName"拼写完全正确,同时用VB.NET原生类型转换更稳妥:
- 用
CType(mo("DriveType"), UInt32)替代Convert.ToUInt32 - 用
CStr(mo("ProviderName"))替代Convert.ToString
4. 处理本地驱动器的特殊情况
本地驱动器(DriveType=3)没有ProviderName属性,访问前要先判断属性是否存在:
If mo.Properties.Contains("ProviderName") AndAlso mo("ProviderName") IsNot Nothing Then uncPath = CStr(mo("ProviderName")) Else uncPath = originalPath.Substring(0, 2) ' 本地路径保留盘符部分 End If
完整可运行示例代码
Imports System.Management Imports System.Linq Public Function ConvertToUncPath(originalPath As String) As String ' 提取盘符(如从"P:\Project X"中获取"P") Dim driveLetter As String = originalPath.Substring(0, 1).ToUpper() ' 构造WMI查询语句 Dim query As String = $"SELECT DriveType, ProviderName FROM Win32_LogicalDisk WHERE DeviceID='{driveLetter}:'" Using searcher As New ManagementObjectSearcher(query) Using collection As ManagementObjectCollection = searcher.Get() Dim mo As ManagementObject = collection.Cast(Of ManagementObject)().FirstOrDefault() If mo Is Nothing Then Return originalPath End If Dim driveType As UInt32 = CType(mo("DriveType"), UInt32) Select Case driveType Case 2 ' 映射网络驱动器 Dim providerName As String = String.Empty If mo.Properties.Contains("ProviderName") AndAlso mo("ProviderName") IsNot Nothing Then providerName = CStr(mo("ProviderName")) End If If Not String.IsNullOrEmpty(providerName) Then Return providerName & originalPath.Substring(2) End If Case 3 ' 本地驱动器 Return originalPath End Select End Using End Using Return originalPath End Function
额外注意事项
- 确保项目已引用
System.Management程序集(右键项目→添加引用→程序集→框架→勾选System.Management) - 运行程序需要基本WMI访问权限,普通用户权限通常足够,域环境下若有问题需检查权限设置
内容的提问来源于stack exchange,提问作者Max Headroom
相关产品推荐
相关产品推荐

