C# 删除文件夹,但进程无法访问该文件,因为正在使用

C# 删除文件夹,但进程无法访问该文件,因为正在使用,c#,winforms,C#,Winforms,所以我做了一个简单的项目,当我点击一个按钮时,图片编辑从一个文件夹文件中获取一个图像,但是当我想删除包含该图像的文件夹时,它会给我一个错误。代码如下所示 private void button1_Click(object sender, EventArgs e) { string pathx = AppDomain.CurrentDomain.BaseDirectory + "\\TempImage\\" + "naruto" + ".png"; pic

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

 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);
        }

    }
这个目的,在我的主要项目中,是为了缓存。所以,我从一个特定的文件夹中获取一个图像,然后将它从服务器复制到本地。当我想关闭主项目时,我需要清除缓存或文件夹

更新

哪一个更好地处理备选方案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();

    }

System.Drawing.Bitmap上的文档说明:

在释放位图之前,文件将保持锁定状态

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

pictureEdit1.Image = Image.FromFile(pathx);
为此:

Image img = new Bitmap(pathx);
pictureEdit1.Image = img.GetThumbnailImage(pictureEdit1.Width, pictureEdit1.Height, null, new IntPtr());
img.Dispose();
这应该只加载位图足够长的时间,以创建用于PictureBox控件的图像的缩略图版本,然后立即处理它,释放文件上的锁,但仍在屏幕上显示图像

希望这有帮助

编辑:以下是使用的版本,其作用相同:

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

可能的副本,可能是因为您在预览窗口中显示它,因此正在访问它。如果正在使用该文件,则无法将其删除?@chopperfield问题是GDI+image使该文件保持打开状态。在您尝试删除该文件或只是将该文件作为字节[]读取并从MemoryStreamhi lusid构建映像之前,请先对其进行处理,这样可以正常工作。但是我现在想问一下,iam using using FileStream stream=new FileStreampathx,FileMode.Open,FileAccess.Read{stream.dispose}是否相同?实际上,C中的using语句会在块结束时自动调用正在使用的对象上的dispose,因此如果使用using,在这两种情况下都不需要dispose。话虽如此,如果您只想将数据加载到内存中显示,我个人不会在这里使用FileStream,但您可以。根据您所说的,当iam使用using语句显示iamge时,它使用内存进行显示,但位图不使用内存。它是?但在块的末尾使用其自动调用dispose。所以它不应该使用内存来显示。。如果在原始Image.FromFile调用中iam错误,请更正我,它将创建一个位图对象,并将其直接分配给PictureBox,同时保持文件的锁定。我所做的只是使用GetThumbnailImage以更少的内存克隆数据,顺便说一句,因为它正在以pb所需的精确大小克隆数据,然后因为不再需要它而处理原始数据。创建的新映像与文件没有任何连接。这是这里唯一重要的事情。只要您没有使用从文件加载的原始位图/图像,您就可以了。很抱歉再次打扰您,因为您可以看到更新代码。它是安全的还是和你的建议一样?。在备选方案1中,我没有使用fromfile而不是stream