-1

我需要做什么才能结束 imagePath 进程?

错误:

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

在此处输入图像描述

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() 不适用于这个问题。

4

3 回答 3

7

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

这记录在Image.FromFile

该文件保持锁定状态,直到图像被释放。

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

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

这将导致两个Image实例都被正确处理。

于 2013-03-26T15:20:09.673 回答
2

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

于 2013-03-26T15:20:02.657 回答
2

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

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

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

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

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

于 2013-03-26T15:20:35.797 回答