2011-04-21 81 views
21

令我驚訝的是,這種代碼不會產生預期的結果:爲什麼Path.Combine用相對路徑產生這個結果?

var basePath = @"\\server\BaseFolder"; 
var relativePath = @"\My\Relative\Folder"; 

var combinedPath = Path.Combine(basePath, relativePath); 

結果是\My\Relative\Folder而不是預期的\\server\BaseFolder\My\Relative\Folder

這是爲什麼?組合相對路徑的最好方法是什麼?可能有或可能沒有斜線?

編輯:我知道,我可以做字符串操作上relativePath檢測和刪除的起始斜線。有沒有一種更安全的方式來做這件事(我認爲Path.Combine應該是安全的方式),這將解釋反斜槓和前端?

+9

這不是_relative_路徑。 – SLaks 2011-04-21 18:08:49

+0

我會理解,如果前面有2個反斜槓,使其成爲UNC路徑,但是一個斜槓?真的嗎? – Brandon 2011-04-21 18:10:55

+5

是;認真。 '\ a \ b'是**絕對**路徑。 (雖然它相對於驅動器) – SLaks 2011-04-21 18:13:18

回答

33

刪除relativePath上的斜槓,它應該工作。

發生這種情況的原因是Path.Combine將relativePath解釋爲根(絕對)路徑,因爲在這種情況下,它始於\。您可以通過使用Path.IsRooted()來檢查路徑是相對路徑還是根路徑。

doc

如果隨後的路徑的一個是 絕對路徑,則結合 操作復位開始與 絕對路徑,丟棄所有先前 合併的路徑。

18

以斜線開頭的路徑被解釋爲絕對路徑而不是相對路徑。如果您想確保relativePath將被視爲相對,只需簡單地修剪斜線即可。

var basePath = @"\\server\BaseFolder"; 
var relativePath = @"\My\Relative\Folder"; 

var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\')); 
相關問題