代码之家  ›  专栏  ›  技术社区  ›  user979331

asp.net system.io.file.delete不工作-物理路径,但需要虚拟路径

  •  -4
  • user979331  · 技术社区  · 6 年前

    我正试图通过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 回复  |  直到 6 年前
        1
  •  0
  •   Win    6 年前

    我们使用的原因 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.
    }
    
        2
  •  -1
  •   jkosmala    6 年前

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

    问题在这里: var filePath = System.Web.HttpContext.Current.Server.MapPath("C:/www/project/Images/" + landingCells.imageBytes);

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

    另外,当您遇到类似的问题时,捕获异常并将其记录下来非常有用。