2012-03-19 72 views
1

下面是代碼的簡單的兩行:Path.Combine作用出乎意料

public static void RemoveCoverImageForProduct(int productId) 
{ 
    using (var productRepository = new EfProductRepository()) 
    { 
     var product = productRepository.FindById(productId); 
     var coverFolderPath = HttpContext.Current.Server.MapPath(@"~/"); 
     var filePath = Path.Combine(coverFolderPath, product.CoverImagePath); 
     if (File.Exists(filePath)) 
      File.Delete(filePath); 
    } 
} 

Server.MapPath()正在返回:

C:\Users\Sergio\Desktop\MyApp\MyApp.WebUI\ 

product.CoverImagePath是返回:

/Public/products/buscar.jpg 

他們兩個運行Path.Combine,運行後意義filePath值的結果是:

/Public/products/buscar.jpg 

什麼我期待的是:

C:\Users\Sergio\Desktop\MyApp\MyApp.WebUI\Public\products\buscar.jpg 

任何想法,爲什麼這不符合我的預期?

回答

2

Path.Combine的第二個參數的規則是

如果PATH2不包括根目錄(例如,如果PATH2不與分隔符或驅動器規範開始),其結果是一個級聯這兩條路徑中間有一個分隔符。 如果path2包含一個根,則返回path2。

product.CoverImagePath斜線是根,這就是爲什麼Path.Combine將返回

/Public/products/buscar.jpg 

假設你知道,它開始以斜線,你可以將其刪除,並傳遞到Path.Combine

var filePath = Path.Combine(coverFolderPath, product.CoverImagePath.Substring(1)); 

如果您不確定,請使用條件:

var relativeFilename = Path.IsPathRooted(product.CoverImagePath) 
    ? product.CoverImagePath.Substring(1) 
    : product.CoverImagePath; 
var filePath = Path.Combine(coverFolderPath, relativeFilename); 
+0

通過謝謝路徑/Public/products/buscar.jpg,我不知道這個過載。 – 2012-03-19 02:37:40

0

這一切都在docs

如果PATH2不包括根目錄(例如,如果PATH2不啓動 與分隔符或驅動器規範),其結果是 級聯兩條路徑中,插入分隔符 字符。 如果path2包含一個根,則返回path2。

一個斜槓(「/」)是一個分隔符,因此你找回你。