结束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()不适用于此问题。
答案 0 :(得分:7)
您需要先Dispose()
您的图片,然后才能删除它。现在,您已打开图像文件。
文件保持锁定状态,直到图像被丢弃。
在您的代码中,处理此问题的一种方法是编写:
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语句中。这将从内存中清除所有非托管资源。