[英]File Being Used By Two Processes
我正在尝试编写一些代码,一旦用户单击某些“删除”按钮,就会从硬盘上删除图像。 有时我得到以下异常,有时却没有。 而且,当我实际执行此操作时,如果再次尝试将其删除,则大多数情况下它确实可以正常工作。
这是例外:
System.IO.IOException:该进程无法访问该文件,因为它正在被另一个进程使用。
我想我应该提供一些确切的信息:
我不确定如何解决此问题,因为该异常未提供有关哪个其他进程正在保存该文件的任何信息。 有任何想法吗?
更新:
public byte[] ResizeImageToBytes(string path, int size, string name)
{
var newImage = Image.FromFile(path);
int newWidth; int newHeight;
if (size == 470)
{
if (newImage.Height != 250)
{
newWidth = (int)Math.Round(newImage.Width * (100 / (newImage.Height / 250)) * 0.01);
newHeight = 250;
}
else
{
newWidth = newImage.Width;
newHeight = newImage.Height;
}
}
else
{
if (newImage.Width > newImage.Height)
{
newWidth = size;
newHeight = newImage.Height*size/newImage.Width;
}
else
{
newWidth = newImage.Width*size/newImage.Height;
newHeight = size;
}
}
var thumb = new Bitmap(newWidth, newHeight);
var gfx = Graphics.FromImage(thumb);
gfx.CompositingQuality = CompositingQuality.HighQuality;
gfx.SmoothingMode = SmoothingMode.HighQuality;
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
var rect = new Rectangle(0, 0, newWidth, newHeight);
gfx.DrawImage(newImage, rect);
var ms = new MemoryStream();
thumb.Save(ms, newImage.RawFormat);
return ms.GetBuffer();
}
public void SaveImage(byte[] toSave, string path)
{
using (var ms = new MemoryStream())
{
ms.Write(toSave, 0, toSave.Length);
using(var theImage = Image.FromStream(ms))
{
theImage.Save(path);
}
}
}
[HttpPost]
public ActionResult Upload()
{
var newFile = System.Web.HttpContext.Current.Request.Files["Filedata"];
string guid = Guid.NewGuid() + newFile.FileName;
string itemImagesFolder = Server.MapPath(Url.Content("~/Content/ItemImages/"));
string fileName = itemImagesFolder + "originals/" + guid;
newFile.SaveAs(fileName);
string finalPath;
foreach (var dim in ImageDimensionsList.Options)
{
var bytes = _imageService.ResizeImageToBytes(fileName, dim.Width, guid);
finalPath = itemImagesFolder + dim.Title + "/" + guid;
_imageService.SaveImage(bytes, finalPath);
}
return Content(guid);
}
您不会在ResizeImageToBytes
方法中处置正在使用的任何可抛弃资源。 这会导致应用程序以及句柄锁定文件中的泄漏句柄泄漏。 尝试这个:
public byte[] ResizeImageToBytes(string path, int size, string name)
{
using (var newImage = Image.FromFile(path))
{
int newWidth; int newHeight;
if (size == 470)
{
if (newImage.Height != 250)
{
newWidth = (int)Math.Round(newImage.Width * (100 / (newImage.Height / 250)) * 0.01);
newHeight = 250;
}
else
{
newWidth = newImage.Width;
newHeight = newImage.Height;
}
}
else
{
if (newImage.Width > newImage.Height)
{
newWidth = size;
newHeight = newImage.Height * size / newImage.Width;
}
else
{
newWidth = newImage.Width * size / newImage.Height;
newHeight = size;
}
}
using (var thumb = new Bitmap(newWidth, newHeight))
using (var gfx = Graphics.FromImage(thumb))
{
gfx.CompositingQuality = CompositingQuality.HighQuality;
gfx.SmoothingMode = SmoothingMode.HighQuality;
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
var rect = new Rectangle(0, 0, newWidth, newHeight);
gfx.DrawImage(newImage, rect);
using (var ms = new MemoryStream())
{
thumb.Save(ms, newImage.RawFormat);
return ms.GetBuffer();
}
}
}
}
就您的SaveImage
方法而言,此方法对我来说似乎是多余的,因为它已经存在于.NET框架中。 它称为File.WriteAllBytes :
public void SaveImage(byte[] toSave, string path)
{
File.WriteAllBytes(path, toSave);
}
在上载例程中,您是否在文件阅读器周围使用using
语句? 如果否,则文件资源不会返回到OS,因此仍在“使用”状态。
若要查找有关文件中还有其他进程的信息,应使用诸如ProcessExplorer(sysinternals.com)之类的工具。 它具有此便捷的搜索功能(查找>查找句柄或DLL),您可以在其中输入类似文件名的字符串,并且它将搜索所有句柄并告诉您哪个进程打开了该句柄。
通常,当我遇到像您这样的意外错误时,这是我去的第一站。
希望这可以帮助,
约翰
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.