如何从设备路径解析带有驱动器号的路径?
例如,转换
\Device\HarddiskVolume4\Windows\System32\RuntimeBroker.exe
到
C:\Windows\System32\RuntimeBroker.exe
假设HarddiskVolume4
映射到此计算机上的C:
。
我找到this question,但我想在C#中使用它。
答案 0 :(得分:0)
string devicePath = @"\Device\HarddiskVolume4\Windows\System32\RuntimeBroker.exe";
string driveLetterPath = DevicePathMapper.FromDevicePath(devicePath);
// driveLetterPath == C:\Windows\System32\RuntimeBroker.exe
由于我们需要带有驱动器号的路径,因此我们需要将\Device\HarddiskVolume4
替换为正确的驱动器号,例如C:
。为此使用QueryDosDevice
并将dos设备映射到每个驱动器号。然后我们可以搜索和替换dos设备路径。
这是一种可能的实施方式。它使用内部扩展方法:
public static class DevicePathMapper {
[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
private static extern uint QueryDosDevice([In] string lpDeviceName, [Out] StringBuilder lpTargetPath, [In] int ucchMax);
public static string FromDevicePath(string devicePath) {
var drive = Array.Find(DriveInfo.GetDrives(), d => devicePath.StartsWith(d.GetDevicePath(), StringComparison.InvariantCultureIgnoreCase));
return drive != null ?
devicePath.ReplaceFirst(drive.GetDevicePath(), drive.GetDriveLetter()) :
null;
}
private static string GetDevicePath(this DriveInfo driveInfo) {
var devicePathBuilder = new StringBuilder(128);
return QueryDosDevice(driveInfo.GetDriveLetter(), devicePathBuilder, devicePathBuilder.Capacity + 1) != 0 ?
devicePathBuilder.ToString() :
null;
}
private static string GetDriveLetter(this DriveInfo driveInfo) {
return driveInfo.Name.Substring(0, 2);
}
private static string ReplaceFirst(this string text, string search, string replace) {
int pos = text.IndexOf(search);
if (pos < 0) {
return text;
}
return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
}
}