如何从共享路径获取驱动器根目录?

时间:2015-05-28 09:13:06

标签: c#

我有一个包含某个路径的文件夹,例如C:\repository\data

我分享了这个文件夹,因此它有一些主机名,例如\\10.10.10.254\repository\data

我有一个方法

string GetDriveRootPathFromPath(IEnumerable<string> lokalPathCollection, string sharePath)
{
      var rootPath = _win32.GetVolumePathName(sharePath);
      return lokalPathCollection.FirstOrDefault(x => x.Equals(rootPath, StringComparison.OrdinalIgnoreCase));
}

他们没有工作,因为他们找不到名称为\\10.10.10.254\的磁盘。

在我的示例中,如何修改此方法以查找磁盘C:\,因为repository\data位于此磁盘上?

2 个答案:

答案 0 :(得分:3)

简单回答:你不能。因为Windows共享不包含有关本地路径的信息。

答案很长:

由于您知道服务器的IP地址或主机名,并且您有权执行wmi查询,因此您可以使用wmi来获取信息。

pulic string GetLocalPath(string computerName, string shareName)
{
    var scope = new ManagementScope(string.Format(@"\\{0}\root\cimv2", computerName));      
    scope.Connect();
    var query = new ObjectQuery("SELECT * FROM win32_share WHERE name = '" + shareName + "'");
    var searcher = new ManagementObjectSearcher(scope,query);
    var queryCollection = searcher.Get();
    foreach (ManagementObject m in queryCollection)
    {
        return m["Path"];
    }

    return null;
}

用法:

    var path = @"\\10.10.10.254\repository\data";
    var segments = path.Split('\\');

    var computerName = segments[2];
    var shareName = segments[3];
    var localPath = GetLocalPath(computerName, shareName);
    var result = Path.Combine(localPath, String.Join("\\", segments.Skip(4)));

答案 1 :(得分:1)

首先,您可以分享以下子文件夹:

c:\path1\path2\myshare

它看起来像

\\127.0.0.1\mysahre

因此,您处理所有共享文件夹的示例应位于驱动器的根目录

然后您可以从lokalPathCollection中的路径中删除前导驱动器。 我的意思是,您需要存储C:\repository\data,而不是存储repository\data。 在这种情况下,将您的行更改为:

return "c:\\" + lokalPathCollection.FirstOrDefault(x => x.EndWith(rootPath, StringComparison.OrdinalIgnoreCase));