Asp.net mvc ASP.NET MVC是否删除文件?

Asp.net mvc ASP.NET MVC是否删除文件?,asp.net-mvc,file-upload,delete-file,Asp.net Mvc,File Upload,Delete File,我得到这个错误 The process cannot access the file '..\Images\Temp\6574_1212665562989_1419270107_30610848_6661938_n.jpg' because it is being used by another process. 当我尝试这样做时: try { var file = Request.Files["FileProfilePicture"]; file.SaveAs(Server.

我得到这个错误

The process cannot access the file '..\Images\Temp\6574_1212665562989_1419270107_30610848_6661938_n.jpg' because it is being used by another process.
当我尝试这样做时:

try
{
    var file = Request.Files["FileProfilePicture"];
    file.SaveAs(Server.MapPath("~/Images/Temp/" + file.FileName));
    Bitmap imageOrj = new Bitmap(System.Web.HttpContext.Current.Server.MapPath("~/Images/Temp/" + file.FileName));
    Image imageBig = ResizeImage.Resize(imageOrj, 100, 100);
    imageBig.Save(System.Web.HttpContext.Current.Server.MapPath("~/Images/ProfilePicBig/" + file.FileName));
    Image imageSmall = ResizeImage.Resize(imageOrj, 50, 50);
    imageSmall.Save(System.Web.HttpContext.Current.Server.MapPath("~/Images/ProfilePicSmall/" + file.FileName));

    string[] files = System.IO.Directory.GetFiles(Server.MapPath("~/Images/Temp/"));
    foreach (string pathFile in files)
    {
        System.IO.File.Delete(pathFile);
    }


    return RedirectToAction("Index", "Author");
}
catch (Exception e)
{
    ModelState.AddModelError("", "Kullanıcı bilgileri güncellenirken bir hata oluştu. Lütfen daha sonra tekrar deneyin." + e.Message);
}
我怎样才能修好它。或者另一种更好的方法将图像保留为临时图像。我应该将文件保存在临时文件夹中吗


谢谢

您不需要保存临时文件。您可以在内存中创建位图并用请求流填充它。无需将其保存到磁盘。

无需保存临时文件。您可以在内存中创建位图并用请求流填充它。无需将其保存到磁盘。

是否确保没有在其他地方打开临时文件

当您在上一次运行中出现错误且文件尚未关闭时,也会发生此错误。在这种情况下,您可以尝试使用其他文件名,也可以从操作系统端删除未关闭的文件

我希望这有助于

否则,我通常使用类似的方法处理临时文件

编辑:根据评论,上述问题的解决方案似乎如下:每当在try-catch块中处理时,如果未在catch节点中处理,文件对象可能不会关闭。
在这种特定情况下,问题是由
imageOrj
对象引起的,因此建议在位图编辑完成后使用
imageOrj.Dispose()

是否确保没有在其他地方打开临时文件

当您在上一次运行中出现错误且文件尚未关闭时,也会发生此错误。在这种情况下,您可以尝试使用其他文件名,也可以从操作系统端删除未关闭的文件

我希望这有助于

否则,我通常使用类似的方法处理临时文件

编辑:根据评论,上述问题的解决方案似乎如下:每当在try-catch块中处理时,如果未在catch节点中处理,文件对象可能不会关闭。
在这种特定情况下,
imageOrj
对象导致了问题,因此建议在位图编辑完成后使用
imageOrj.Dispose()

您删除的文件似乎比删除循环中创建的文件要多。您试图删除~/Images/Temp/下的每个文件,这可能会产生冲突(即不同请求之间的数据竞争)。仅删除刚创建的文件。

您删除的文件似乎比删除循环中创建的文件多。您试图删除~/Images/Temp/下的每个文件,这可能会产生冲突(即不同请求之间的数据竞争)。仅删除您刚刚创建的文件。

保存后如何关闭文件。我不确定FileStream().close()是否可以解决此问题,它不是FileStream,而是HttpPostedFileBase。但是SaveAs方法不应该打开文件,因为它只是创建了文件的副本(或者将HttpPostedFile刷新到其中),所以引发抖动的必须是位图对象。。。这意味着这就是保持文件打开的方法,所以我想你可以在完成位图后使用imageOrj.Dispose()。我认为Jakub文章中的链接是一个很好的例子,因此如果这解决了你的问题,你可以接受答案是…imageOrj.Dispose()。如果你写作为答案。我接受你的。ThanksHow保存后是否可以关闭文件。我不确定FileStream().close()是否可以解决此问题,它不是FileStream,而是HttpPostedFileBase。但是SaveAs方法不应该打开文件,因为它只是创建了文件的副本(或者将HttpPostedFile刷新到其中),所以引发抖动的必须是位图对象。。。这意味着这就是保持文件打开的方法,所以我想你可以在完成位图后使用imageOrj.Dispose()。我认为Jakub文章中的链接是一个很好的例子,因此如果这解决了你的问题,你可以接受答案是…imageOrj.Dispose()。如果你写作为答案。我接受你的。谢谢,我认为这不重要。这怎么不重要呢?设想两个并发请求,都创建不同的文件,其中一个请求将提前完成,并尝试删除第一个请求已经使用的文件。temp目录上显然存在数据竞争:-)我认为,这并不重要。这怎么不重要?设想两个并发请求,都创建不同的文件,其中一个请求将提前完成,并尝试删除第一个请求已经使用的文件。temp目录上显然存在数据竞争:-)