删除文件夹,但进程因使用而无法访问该文件

时间:2017-04-13 06:07:16

标签: c# winforms

所以我做了一个简单的项目,当我点击按钮时,图片编辑从文件夹文件中获取图像,但是当我想删除包含图像的文件夹时,它会给我一个错误。代码如下

 private void button1_Click(object sender, EventArgs e)
    {
        string pathx = AppDomain.CurrentDomain.BaseDirectory + "\\TempImage\\" + "naruto" + ".png";
        pictureEdit1.Image = Image.FromFile(pathx);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        string dir = AppDomain.CurrentDomain.BaseDirectory + "\\TempImage";
        try {
            if (Directory.Exists(dir))
            {
                //////give me an error in here///////
                Directory.Delete(dir, true);
            }
            else
            {
                MessageBox.Show("folder not found");
            }
        }
        catch (Exception ex)
            {
            MessageBox.Show(ex.Message);
        }

    }

enter image description here

这个目的,是在我的主项目中,用于缓存目的。所以我从服务器到本地应对后从某个文件夹中获取图像。当我想关闭主项目时,我需要清除缓存或文件夹

更新

这是更好的备用1或备用2(处置)

   private void button1_Click(object sender, EventArgs e)
    {
        string pathx = AppDomain.CurrentDomain.BaseDirectory + "\\TempImage\\" + "naruto" + ".png";

        //alternate1
        using (FileStream stream = new FileStream(pathx, FileMode.Open, FileAccess.Read))
        {
            pictureEdit1.Image = Image.FromStream(stream);
            //stream.Dispose();
        }

        //alternate2
        //Image img = new Bitmap(pathx);
        //pictureEdit1.Image = img.GetThumbnailImage(pictureEdit1.Width, pictureEdit1.Height, null, new IntPtr());
        //img.Dispose();

    }

1 个答案:

答案 0 :(得分:1)

System.Drawing.Bitmap(http://msdn.microsoft.com/en-us/library/0cbhe98f.aspx)上的文档说:

  

文件保持锁定状态,直到丢弃位图。

要解决此问题,您应该替换此行:

pictureEdit1.Image = Image.FromFile(pathx);

有了这个:

Image img = new Bitmap(pathx);
pictureEdit1.Image = img.GetThumbnailImage(pictureEdit1.Width, pictureEdit1.Height, null, new IntPtr());
img.Dispose();

这应该只加载Bitmap足够长的时间来创建用于PictureBox控件的图像的缩略图版本,然后立即处理它,释放文件上的锁定但仍然在屏幕上显示图像。

希望这有帮助!

修改:以下是使用使用执行相同操作的版本:

using (Image img = new Bitmap(pathx)) {
  pictureEdit1.Image = img.GetThumbnailImage(pictureEdit1.Width, pictureEdit1.Height, null, new IntPtr());
}