2013-03-15 2 views
0

Я хочу написать метод для замены имени сервера по пути UNC. Так что если у меня есть "\\server1\folder\child", я хочу обменять его на "\\server2\folder\child". Различные попытки сделать это столкнулись с зубчатыми краями с обработкой обратной связью .net (regex, Path.Combine). Я не буду знать имя «server1» во время выполнения.Заменить имя_сервера в пути UNC

Вот отрывок я тестировал в LINQPad, в то время как он работает, кажется, довольно Hacky:

string path = @"\\server1\folder\child"; 

var uri = new Uri(path); 

string newPath = @"\\server2\"; 

foreach (var part in uri.Segments) 
{ 
if (part == "/") 
    continue; 

newPath += part; 
} 

var x = new Uri(newPath); 

uri.Dump(); 

x.LocalPath.Dump(); 
+4

Какие различные попытки? Показать некоторые ... –

+0

и «\ server1 \ folder \ child» не является UNC-контуром ... (в отличие от «\\ server \ share \ path \ file.txt») –

+0

@ Bash.d извините, я случайно разместил вопрос прежде чем я это сделал. – peacedog

ответ

3

Вы были на правильном пути (не каламбур)

Быстрое редактирование вашего кода листьев это:

string path = @"\\server1\folder\child"; 

var uri = new Uri(path); 

string newPath = @"\\server2" + uri.AbsolutePath.Replace('/', '\\'); 

var x = new Uri(newPath); 
+0

Ну, я думаю, я собираюсь это сделать. Хотя кажется, что мои первоначальные попытки использовать Split для сброса частей в массив не сработали, потому что я получал пробелы, которые привели (я не понимаю, почему они не являются проблемой в некоторых примерах Split в других ответах , и это пятница, и мне все равно). В любом случае, ваш путь не подходит, как мой. – peacedog

1

Попробуйте использовать этот метод string.Format;

string path = @"\\server1\folder\child"; 
string server = "server2"; 
string newPath = string.Format(@"\{0}\{1}" + server + @"\{3}\{4}", 
           path.Split('\\')); 

Или это с помощью Substring и IndexOf методы;

string s = @"\\server1\folder\child"; 
string server = @"\\server2"; 
string s2 = server + s.Substring(s.Substring(2).IndexOf(@"\")+2); 
+0

Проблема, с которой я столкнулся с Split(), заключалась в том, что во время выполнения строка действительно выглядит как «\\\\ server1 \\ folder \\ child», и когда я попытался сбрасывать результаты в массив, я получил пробелы, которые привели (и я не хочу в него вникать, но другой дева предпочитал, чтобы я вообще не раскололся). String.Format делает что-то волшебное там, чтобы избежать их? Потому что ваш фрагмент определенно делает то, что я хочу в LINQPad. – peacedog

+0

String.Format ничего не делает с операцией Split. Он просто берет данный номер элемента из массива строк и присваивает их в соответствии с форматированной строкой. Вы видите двойную «обратную косую черту» для одного «обратного слэша», потому что один символ «обратная черта» используется как escape-символ. Я использую '@', чтобы избежать их здесь в этом примере. – Kaf

+0

Я знаю, почему я вижу двойную обратную косую черту, но понимаю, что раньше я неправильно понял что-то в вашем ответе. – peacedog

0

Я не уверен, что вы пытались с Regex эс, но я думаю, что это должно в основном делать то, что вы ищете:

var path = @"\\server1\folder\child"; 
var replaced = Regex.Replace(path, @"\\\\[A-Za-z0-9]*\\", @"\\server2\"); 
0
string ReplaceServer(string path, string newServer) 
    { 
     return path.Replace(path.Split('\\')[2], newServer); 
    } 
0

И чтобы доказать, что есть тысячи различные способы кожи кошки:

string oldPath = "\\testserver1\\folder\\child";  
string newServer ="testserver2"; 
var subPath = oldPath.Split(new []{'\\'},StringSplitOptions.RemoveEmptyEntries) 
    .Skip(1) 
    .Take(Int32.MaxValue) 
    .ToList(); 
subPath.Insert(0,newServer); 
var newPath = Path.Combine(subPath.ToArray()); 
newPath = @"\\"+newPath; 
newPath.Dump();