簡體   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