5

我在图片框中使用 c# 显示图像。然后我想更改图像的名称。我不能,因为我知道该图像正在被另一个进程使用。

我以这种方式打开图像

 Image image1 = Image.FromFile("IMAGE LOCATION"); ;
        pictureBox1.Image = image1; 

然后尝试以这种方式更改它的名称,我得到一个 IO 异常,说“该进程无法访问该文件,因为它正在被另一个进程使用。

System.IO.File.Copy(@"OldName", @"NewName"); //copy changes name if paths are in the same folder

对象 image1 不是持有图像吗?为什么文件仍然被上一个进程锁定?任何建议,将不胜感激。非常感谢!

4

5 回答 5

11

看看这个问题:Free file locked by new Bitmap(filePath)

要释放锁,您需要复制这些位:

Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
     img = new Bitmap(bmpTemp);
}
于 2012-11-29T12:19:41.887 回答
3

你可以试试这个:

Image image1 = null;

using(FileStream stream = new FileStream("IMAGE LOCATION", FileMode.Open))
{
    image1 = Image.FromStream(stream);
}

pictureBox1.Image = image1

;

于 2012-11-29T12:24:57.090 回答
3

是的,以这种方式picture box控制磁盘上的锁定IO文件。

如果要重命名链接文件,可以:

  • 或 dispose picture box,然后重命名文件(如果这适合您的应用程序)

  • 或分配给picture box图像的副本/克隆。

于 2012-11-29T12:17:51.967 回答
2

你需要处理你的图像:

 Image image1 = Image.FromFile("IMAGE LOCATION"); ;
    pictureBox1.Image = image1;
 image1.Dispose();

采取行动。

于 2015-02-14T01:08:36.183 回答
0

这个解决方案解决了我的问题。我正在使用图片框并直接从磁盘加载其图像,而无需中间图像文件。完成后,我正在执行“picturebox.dispose”,但并没有释放图像文件,我无法删除它,因为“vshost 正在使用文件”。我必须显式创建一个图像变量(IE 将 MyImage 作为图像进行调暗),然后首先将图像加载到图像变量中,然后将 MyImage 加载到图片框中。通过引用图像,我可以执行 MyImage.dispose。这关闭了 vshost 和图像之间的链接,我能够以编程方式删除它。

于 2017-02-09T04:08:44.283 回答