C# 将低级磁盘名转换为高级磁盘名

C# 将低级磁盘名转换为高级磁盘名,c#,performancecounter,hard-drive,C#,Performancecounter,Hard Drive,我正在编写一个基本的诊断工具,向高级用户展示他们计算机中的瓶颈所在,这样他们就会明白,获得更多的ram/更快的处理器并不能解决他们的问题。我一直非常依赖.NET环境中的性能计数器类,到目前为止,它工作得很好 但是,在使用逻辑磁盘驱动器时,我遇到了一个小问题。在我的计算机上,我有一个用于办公室共享文档驱动器Z的网络驱动器,但是性能计数器将该驱动器称为硬盘卷2。我知道在引擎盖下,这就是逻辑驱动器的实际名称,Z:的别名实际上只是为了用户的利益,但是如果我离开它,用户将不知道HarddiskVolume

我正在编写一个基本的诊断工具,向高级用户展示他们计算机中的瓶颈所在,这样他们就会明白,获得更多的ram/更快的处理器并不能解决他们的问题。我一直非常依赖.NET环境中的性能计数器类,到目前为止,它工作得很好

但是,在使用逻辑磁盘驱动器时,我遇到了一个小问题。在我的计算机上,我有一个用于办公室共享文档驱动器Z的网络驱动器,但是性能计数器将该驱动器称为硬盘卷2。我知道在引擎盖下,这就是逻辑驱动器的实际名称,Z:的别名实际上只是为了用户的利益,但是如果我离开它,用户将不知道HarddiskVolume2是什么


有没有办法使用任何系统调用将硬盘卷2转换为Z?

如果您想查看所有映射驱动器及其解析路径的列表:

Console.WriteLine(String.Join(Environment.NewLine,
    GetUNCDrives().Select(kvp => 
        string.Format("{0} => {1}", kvp.Key, kvp.Value))));
如果要获取路径的可能较短分辨率列表,请执行以下操作:

var longPath = @"\\HarddiskVolume2\ent\RRPSTO\foobar\file.txt";

Console.WriteLine(string.Join(Environment.NewLine, GetShortPaths(longPath)));
如果您只是假设只有一个映射驱动器分辨率,您可以选择第一个:

var shortPaths = GetShortPaths(longPath);
var path = shortPaths.Length > 0 ? shortPaths[0] : longPath;
或者你可以根据网络地图的深度从列表中选择。因此,要获得最短映射路径而不是最短路径名称,只需计算路径中有多少“/”

或者你可以作弊,只取路径名最短的一个。但这并不能保证是最简单的路径

不管你想怎么做,下面的代码就是让上面的代码工作的原因。 你需要这些人:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.IO;
您还需要在项目引用中包含System.Management.dll

代码:


可能是@Jay的复制品,我不认为是复制品。这个问题是关于C++和我的。如果你在Python中找到了我的问题的答案,你会称它为一个副本吗?@ HANSPASAN。文档对这些函数实际做了些什么,但看起来很有希望。我来试试。@Jrud:C语言没有你想要的功能。该特性存在于平台API中,它充其量与语言无关,实际上与C/C++密切相关。现在,也就是说…建议的副本是专门关于网络共享的,而您问题的标题似乎表明您可能对一个更一般的答案感兴趣,而不仅仅是处理网络共享。您的问题并不清楚,因为您使用的示例是关于网络共享的。如果您改进了问题,请记住现有信息可能不是C语言。
/// <summary>Gets array of all possible shorter paths for provided path.</summary>
/// <param name="path">The path to find alternate addresses for.</param>
static string[] GetShortPaths(string path)
{
    return GetUNCDrives()
        .Where(kvp => path.StartsWith(kvp.Value))
        .Select(kvp => Path.Combine(kvp.Key, path.Substring(kvp.Value.Length + 1)))
        .ToArray();
}

/// <summary>Gets all mapped drives and resolved paths.</summary>
/// <returns>Dictionary: Key = drive, Value = resolved path</returns>
static Dictionary<string, string> GetUNCDrives()
{
    return DriveInfo.GetDrives()
        .Where(di => di.DriveType == DriveType.Network)
        .ToDictionary(di => di.RootDirectory.FullName
                    , di => GetUNCPath(di.RootDirectory.FullName.Substring(0, 2)));
}

/// <summary>Attempts to resolve the path/root to mapped value.</summary>
/// <param name="path">The path to resolve.</param>
static string GetUNCPath(string path)
{
    if (path.StartsWith(@"\\"))
        return path;

    var mo = new ManagementObject(string.Format("Win32_LogicalDisk='{0}'", path));

    return Convert.ToUInt32(mo["DriveType"]) == (UInt32)DriveType.Network 
            ? Convert.ToString(mo["ProviderName"]) 
            : path;
}