位图上的 File.Delete 不起作用,因为该文件正被另一个进程使用(我使用 bitmap.Dispose();)
File.Delete on bitmap doesn't work because the file is being used by another process (I used bitmap.Dispose();)
我正在用 C# 创建 Windows 表单应用程序。
我在表单上有一些按钮,我使用 BackgroundImage
属性 在它们上面设置位图图像。
我想动态更改这些图像:
我用了using (bitmap = new Bitmap...)
,保存了一张新的位图图片。
我将新位图分配到按钮上。
然后,我尝试通过调用 Dispose()
和 System.IO.File.Delete(nameToDelete)
;
来删除旧位图
问题:File.Delete
函数抛出异常:"file is being used by another process" 删除不了
我也试过调用 GC.Collect()
并将位图分配给 null
但它没有用。
我找到的唯一"solution"是在删除前调用Thread.Sleep(2)
,但它是一个补丁,每次都不起作用。
代码如下(layerPics[z] 是一个包含所有位图的数组,每个按钮一个):
string name = "new name";
Bitmap bitmap;
using (bitmap = new Bitmap(x, y))
{
Form.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
bitmap.Save(name);
button.BackgroundImageLayout = ImageLayout.Stretch;
button.BackgroundImage = Image.FromFile(name);
}
layerPics[z].Dispose();
layerPics[z] = null;
layerPics[z] = bitmap;
我能做什么?
谢谢!
不是 Bitmap
导致问题,而是这一行:
Buttons.BackgroundImage = Image.FromFile(name);
在这里,您使用工厂方法 FromFile()
创建 Image
class 的实例。文件保持锁定状态,直到 Image
被释放。
我正在用 C# 创建 Windows 表单应用程序。
我在表单上有一些按钮,我使用 BackgroundImage
属性 在它们上面设置位图图像。
我想动态更改这些图像:
我用了
using (bitmap = new Bitmap...)
,保存了一张新的位图图片。我将新位图分配到按钮上。
然后,我尝试通过调用
Dispose()
和System.IO.File.Delete(nameToDelete)
; 来删除旧位图
问题:File.Delete
函数抛出异常:"file is being used by another process" 删除不了
我也试过调用 GC.Collect()
并将位图分配给 null
但它没有用。
我找到的唯一"solution"是在删除前调用Thread.Sleep(2)
,但它是一个补丁,每次都不起作用。
代码如下(layerPics[z] 是一个包含所有位图的数组,每个按钮一个):
string name = "new name";
Bitmap bitmap;
using (bitmap = new Bitmap(x, y))
{
Form.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
bitmap.Save(name);
button.BackgroundImageLayout = ImageLayout.Stretch;
button.BackgroundImage = Image.FromFile(name);
}
layerPics[z].Dispose();
layerPics[z] = null;
layerPics[z] = bitmap;
我能做什么? 谢谢!
不是 Bitmap
导致问题,而是这一行:
Buttons.BackgroundImage = Image.FromFile(name);
在这里,您使用工厂方法 FromFile()
创建 Image
class 的实例。文件保持锁定状态,直到 Image
被释放。