以下是简单的两行代码:
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
为什么这不符合预期的任何想法?
答案 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
。