2015-05-28 23 views
1

У меня есть папка с некоторым путем, например 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 находятся на этом диске?

ответ

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

Я думаю, что мы должны установить' сегменты [2] 'и' сегменты [3] ', а не' сегменты [1] 'и' сегменты [2] '. И почему нам нужна последняя строка? – Anatoly

+1

@Anatoly О да, я не компилировал и не отлаживал код. Последняя строка была просто демонстрацией того, как разрешить полный путь в локальном пути. Этот код переведет '\\ 10.10.10.254 \ repository \ data \ files \ file1.txt' в' c: \ shares \ repository \ data \ files \ file1.txt' Не стесняйтесь, чтобы развить код в соответствии с вашими потребностями. –

+0

У меня есть 'System.UnauthorizedAccessException, который был необработанным кодом пользователя. Сообщение = Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)), потому что я подключился к своей виртуальной машине, а не к локальному компьютеру. Как решить эту ситуацию? – Anatoly

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

'lokalPathCollection' содержит только буквы диска, как' C: \\, D: \\, E: \\ 'т.д. – Anatoly

Смежные вопросы