2013-03-15 91 views
0

我想編寫一個方法來換出UNC路徑中的服務器名稱。所以如果我有"\\server1\folder\child"我想換成"\\server2\folder\child"。各種各樣的嘗試做到這一點已經與.net處理反斜槓(正則表達式,Path.Combine)處理成鋸齒狀邊緣。我不會在運行時知道「server1」的名稱。替換UNC路徑中的ServerName

這裏有一個片段我在LinqPad進行了測試,同時它的工作似乎很哈克:

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

各種嘗試?顯示一些... – 2013-03-15 20:17:33

+0

和「\ server1 \ folder \ child」不是UNC路徑...(不像「\\ ​​server \ share \ path \ file.txt」) – 2013-03-15 20:19:31

+0

@ Bash.d對不起,我無意中發佈了這個問題在我完成之前輸入它。 – peacedog 2013-03-15 20:22:53

回答

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 2013-03-15 20:42:05

1

試試用string.Format方法;

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

或者使用SubstringIndexOf方法這一點;

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 2013-03-15 20:38:59

+0

String.Format沒有對Split操作做任何事情。它只是從字符串數組中獲取給定的元素編號,並根據格式化的字符串分配它們。由於一個「反斜槓」被用作轉義字符,因此您會看到單個「反斜槓」的雙反斜槓。在這個例子中,我使用'@'來轉義它們。 – Kaf 2013-03-15 20:52:46

+0

我知道我爲什麼會看到雙反斜槓,但是我意識到現在我在前面的答案中被誤解了。 – peacedog 2013-03-15 20:58:26

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();