ASP.NET System.IO.File.Delete无法正常工作 - 物理路径,但需要虚拟路径

时间:2018-05-30 20:07:53

标签: asp.net asp.net-mvc

我试图通过ASP.NET从服务器删除文件我试图像这样使用System.IO.File.Delete:

try
{
    var filePath = System.Web.HttpContext.Current.Server.MapPath("C:/www/project/Images/" + landingCells.imageBytes);
    if (System.IO.File.Exists(filePath))
    {
        System.IO.File.Delete(filePath);
    }
}
catch
{
    return false;
}

但每次返回false时,我都可以将文件写入服务器:

try
{
    System.IO.File.WriteAllBytes("C:/www/project/Images/" + filePath, bytes);
}
catch
{
    return false;
}

但是我无法删除文件,是文件路径和名称是否正确文件夹是否完全控制,我做错了什么?

这是我得到的错误:

An error occured: ‘C:/www/project/Images/ANW00012018053015551423458244a89b23-5ed7-42a3-a2fc-4b15a90fb3cf.jpg' is a physical path, but a virtual path was expected.

2 个答案:

答案 0 :(得分:0)

我们使用Server.MapPath的原因是我们不想对代码中的文件路径进行硬编码。

try
{
    string fileName = "Sample.jpg";
    var filePath = Server.MapPath("~/Images/" + fileName); // Do not pass byte array here
    if (System.IO.File.Exists(filePath))
    {
        System.IO.File.Delete(filePath);
    }
}
catch
{
    // Do not swallow the exception. Instead, log them to persistant storage.
}

答案 1 :(得分:-1)

首先,非常危险的方法是硬编码文件夹的路径。如果管理员将应用程序移动到磁盘D怎么办?

恕我直言,问题在于: var filePath = System.Web.HttpContext.Current.Server.MapPath("C:/www/project/Images/" + landingCells.imageBytes);

您正在尝试访问流,因此路径很长,看起来或多或少像“C:\ www \ project \ Images \ 0x00a00efe .............”(所以这里的路很长)。您应该使用文件名而不是imageBytes属性。

此外,当您遇到类似问题时,捕获异常并记录它是非常有用的。