与Server.MapPath结合使用时,Path.Combine意外地执行

时间:2012-03-19 02:27:59

标签: c# path

以下是简单的两行代码:

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 个答案:

答案 0 :(得分:2)

Path.Combine的第二个参数的规则是

  

如果path2不包含根(例如,如果path2不以分隔符或驱动器规范开头),则结果是两个路径的串联,以及插入的分隔符。 如果path2包含root,则返回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);

答案 1 :(得分:0)

全部在docs

  

如果path2不包含根(例如,如果path2未启动)   使用分隔符或驱动器规范),结果是a   这两条路径的连接,带有插入分隔符   字符。 如果path2包含root,则返回path2。

斜杠('/')是分隔符,因此您返回传入的路径/Public/products/buscar.jpg