[英]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.