从路径中删除图像

时间:2013-03-26 15:17:50

标签: c# asp.net asp.net-mvc

结束imagePath过程需要做什么?

错误:

  

该进程无法访问该文件   'C:\ Users \ Rafal \ 7074edcf-8849-4ea7-a87d-e2e8b5890f3f.jpg'因为它   正在被另一个进程使用。

enter image description here

public WrappedJsonResult2 UploadImageSmall(HttpPostedFileWrapper imageFile2)
        {

            if (imageFile2 == null || imageFile2.ContentLength == 0)
            {
                return new WrappedJsonResult2
                {
                    Data = new
                    {
                        IsValid = false,
                        Message = "Nie dodano zdjęcia",
                        ImagePath = string.Empty
                    }
                };
            }

这里我有第一张图片的fileName和imagePath

            var fileName = String.Format("{0}.jpg", Guid.NewGuid().ToString());
            var imagePath = Path.Combine(Server.MapPath(Url.Content("~/Content/UserImages")), fileName);

这里我有第二张图片的fileName和imagePath

            var fileNameZmniejszony = String.Format("{0}.jpg", Guid.NewGuid().ToString());
            var imagePathZmniejszony = Path.Combine(Server.MapPath(Url.Content("~/Content/UserImages")), fileNameZmniejszony);

我从JSON保存图片

            imageFile2.SaveAs(imagePath);

我从imageFile2的方向拍照。

            var image = Image.FromFile(imagePath);

我缩放新图片并保存为第二张图片

            var newImage = ScaleImage(image, 300, 400);
            newImage.Save(imagePathZmniejszony);

这里我想删除带有目录第一张图片的文件

            if (System.IO.File.Exists(imagePath))
            {
                System.IO.File.Delete(imagePath);
            }

            var model = new StronaGlowna();
            if (!TryUpdateModel(model))
            {
            }
            model.MaleZdjecie = String.Format("~/Content/UserImages/{0}", fileNameZmniejszony);

            return new WrappedJsonResult2
            {
                Data = new
                {
                    IsValid = true,
                    Message = string.Empty,
                    ImagePath = Url.Content(String.Format("~/Content/UserImages/{0}", fileNameZmniejszony))
                }
            };
        }

为什么我的进程有问题,因为这个进程(HttpPostedFileWrapper imageFile2)

和dispose()不适用于此问题。

3 个答案:

答案 0 :(得分:7)

您需要先Dispose()您的图片,然后才能删除它。现在,您已打开图像文件。

Image.FromFile

中记录了这一点
  

文件保持锁定状态,直到图像被丢弃。

在您的代码中,处理此问题的一种方法是编写:

using(var image = Image.FromFile(imagePath))
{
   using(var newImage = ScaleImage(image, 300, 400))
   {
       newImage.Save(imagePathZmniejszony);
   }
}

这将导致两个Image实例正确处置。

答案 1 :(得分:2)

在删除之前尝试使用image.Dispose()

答案 2 :(得分:2)

您需要处理图像变量。它仍在使用该文件。

在执行删除之前调用image.Dispose();

您还可以在复制时将图像变量包装在using语句中。这是更好的做法。

using (var image = Image.FromFile(imagePath))
{
    var newImage = ScaleImage(image, 300, 400);
    newImage.Save(imagePathZmniejszony);
}

以上将解决问题。始终将一次性对象包装在Using语句中。这将从内存中清除所有非托管资源。