【问题标题】:Delete image from path [closed]从路径中删除图像[关闭]
【发布时间】:2013-03-26 15:17:50
【问题描述】:

我需要做什么才能结束 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
                    }
                };
            }

这里我有第一张图片的文件名和图像路径

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

【问题讨论】:

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


【解决方案1】:

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

这在Image.FromFile中有记录

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

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

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

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

【讨论】:

  • 当我尝试这个时,我得到了类似的错误 -> var image4 = Image.FromFile(imagePath); image4.Dispose();
  • @Rafael-JuniorMVCDeveloper "image" 仍然锁定...您的新代码需要 Dispose image AND image4
  • 问题更大,因为我的文件是 (HttpPostedFileWrapper imageFile2) 并且可能这个 imageFile2 有进程并且 .Dispose() 不会为此工作。我想知道答案,但用户关闭了我的帖子。
  • @Rafael-JuniorMVCDeveloper 这实际上不应该是一个问题。您不需要处理那个,只需处理 Image 实例。
  • 你能看看我编辑的帖子吗?大概是在我没有好好解释之前?
【解决方案2】:

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

【讨论】:

  • imagePath 是一个字符串。
  • 逻辑上为真(用于处置),但不是imagepath.Dispose();,image.Dispose();
  • @tijizor 我收到错误 -> 错误 1“System.Web.HttpPostedFileWrapper”不包含“Dispose”的定义,并且没有扩展方法“Dispose”接受“System.Web”类型的第一个参数.HttpPostedFileWrapper' 可以找到(您是否缺少 using 指令或程序集引用?)
  • 另外,使用语句比 dispose 更优雅,例如@ReedCopsey 建议...
  • @Rafael-JuniorMVCDeveloper 我相信这是因为您的图像是var 类型。这背后有什么原因吗?
【解决方案3】:

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

在删除之前致电image.Dispose();。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多