位图上的File.Delete不起作用,因为该文件正被另一个进程使用(我使用了bitmap.Dispose();)

时间:2015-07-23 11:16:29

标签: c# visual-studio-2010 bitmap dispose delete-file

我正在用C#创建一个Windows窗体应用程序。

我在表单上有一些按钮,我使用BackgroundImage属性在它们上设置位图图像。

我想动态地改变这些图像:

  1. 我使用了using (bitmap = new Bitmap...)并保存了一个新的位图图片。

  2. 我将新位图指定为按钮。

  3. 然后,我尝试通过调用Dispose()然后System.IO.File.Delete(nameToDelete);

  4. 删除旧位图

    问题:File.Delete函数抛出异常:“文件正由另一个进程使用”,我无法删除它。

    我还尝试调用GC.Collect()并将位图分配给null,但它不起作用。

    我找到的唯一“解决方案”是在删除之前调用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;
    

    我该怎么办? 谢谢!

1 个答案:

答案 0 :(得分:4)

导致问题的不是Bitmap,而是这一行:

Buttons.BackgroundImage = Image.FromFile(name);

在这里,您使用工厂方法Image创建FromFile()类的实例。在Image被处理之前,文件将保持锁定状态。

这是the reference