繁体   English   中英

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

[英]How to get drive root from share path?

我有一个带有某些路径的文件夹,例如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\\磁盘。

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

简单答案:不能。 因为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)));

首先,您可以共享子文件夹,例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM