我有一个包含某个路径的文件夹,例如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
位于此磁盘上?
答案 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));