gpt4 book ai didi

c# - 从 Windows NT 设备路径转换为驱动器盘符路径

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:23 26 4
gpt4 key购买 nike

如何从设备路径解析带驱动器号的路径?

例如转换

\Device\HarddiskVolume4\Windows\System32\RuntimeBroker.exe

进入

C:\Windows\System32\RuntimeBroker.exe

假设 HarddiskVolume4 映射到此计算机上的 C:

我找到了 this question ,但我想在 C# 中使用它。

最佳答案

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);
}
}

关于c# - 从 Windows NT 设备路径转换为驱动器盘符路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48320430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com