C# 为什么赢了';GDI允许我删除大图像吗?

C# 为什么赢了';GDI允许我删除大图像吗?,c#,asp.net,file-io,gdi,locked-files,C#,Asp.net,File Io,Gdi,Locked Files,我的ASP.NET应用程序具有图像裁剪和大小调整功能。这要求删除上载的临时映像。一切正常,但当我试图删除一个大于80px乘以80px的图像时,会出现“文件被另一个进程锁定…”错误,尽管我已经释放了所有资源 下面是一个片段: System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath); System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone();

我的ASP.NET应用程序具有图像裁剪和大小调整功能。这要求删除上载的临时映像。一切正常,但当我试图删除一个大于80px乘以80px的图像时,会出现“文件被另一个进程锁定…”错误,尽管我已经释放了所有资源

下面是一个片段:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone(); //advice from another forum
tempimg.Dispose();

img = resizeImage(img, 200, 200); //delete only works if it's 80, 80
img.Save(newpath);
img.Dispose();

File.Delete(temppath);

如果以这种方式创建图像,它将不会被锁定:

using (FileStream fs = new FileStream(info.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    byte[] data = new byte[fs.Length];
                    int read = fs.Read(data, 0, (int)fs.Length);
                    MemoryStream ms = new MemoryStream(data, false);
                    return Image.FromStream(ms, false, false); // prevent GDI from holding image file open
                }

我认为您没有处理分配给img变量的第一个图像实例

请考虑以下情况:

System.Drawing.Image tempimg = System.Drawing.Image.FromFile(temppath);
System.Drawing.Image img = (System.Drawing.Image) tempimg.Clone();
tempimg.Dispose();

System.Drawing.Image img2 = resizeImage(img, 200, 200);
img2.Save(newpath);
img2.Dispose();
img.Dispose();

File.Delete(temppath);

此代码不正确。Image.FromStream的文档声明“必须在映像的生命周期内保持流的打开状态。”上面的代码没有这样做。如果它这样做了,文件将保持锁定。我编辑了我的答案。现在有一个流保持打开状态,文件不会被锁定。